import java.util.Arrays; import java.util.Optional; import java.util.function.Function; import java.util.function.BiFunction; @FunctionalInterface public interface VarargsFunction extends Function { @SuppressWarnings("unchecked") public OUTPUT apply(INPUTS... inputs); public static VarargsFunction from(Function function) { return function::apply; } public static VarargsFunction upgrade(Function function) { return inputs -> function.apply(inputs[0]); } public static VarargsFunction upgrade(BiFunction function) { return inputs -> function.apply(inputs[0], inputs[1]); } @SuppressWarnings("unchecked") public default VarargsFunction andThen( VarargsFunction after) { return inputs -> after.apply(apply(inputs)); } @SuppressWarnings("unchecked") public default Function toFunction() { return input -> apply(input); } @SuppressWarnings("unchecked") public default BiFunction toBiFunction() { return (input, input2) -> apply(input, input2); } @SuppressWarnings("unchecked") public default VarargsFunction transformArguments(Function transformer) { return inputs -> apply((INPUTS[]) Arrays.stream(inputs).parallel().map(transformer).toArray()); } }