我有一个通用方法,它接受var args类型的Function和一个输入,我想处理第一个Function和输入,然后输出将被Function.apply(Function.apply(input))
链接或像Function.andThen(Function)
一样被andThen()
链接,输出函数将接受输入并处理它。
private static <Input,Output> Output flow(Input input, Function<Input,Output>... functions) {
Function<Input,Output> outputFunction;
for (int i =0; i<functions.length; i++) {
outputFunction = functions[i].andThen((Function<? super Output, ? extends Output>) functions[i+1]);
}
}
Q1:是否可以使用函数.apply(输入(;
Q2:是否可以使用函数。andThen(函数(;
Q3:对于同样的问题,还有其他解决方案吗?
Q4:如果我想解决这种类型的链接问题,最佳实践是什么?
正如评论中已经指出的,如果不为每个函数专门定义输入输出类型并保持解决方案的灵活性,就没有一种简单的方法可以生成链式函数。
一个解决方案要求通过保持Function
原始来折衷,该原始不会在编译时强制执行类型,也不会防止运行时错误。
private static Object flow(Object input, Function... functions) {
Object temp = input;
for (Function function : functions) {
temp = function.apply(temp);
}
return temp;
}
用法:
final int input = 1;
final String result = (String) flow(input,
(Function<Integer, Integer>) integer -> integer * 10,
integer -> ((double) integer / 4),
decimal -> "c" + decimal,
string -> List.of("a", "b", string),
(Function<List<Double>, Set<Double>>) HashSet::new,
(Function<Set<String>, String>) set -> String.join("-", set)
);
结果:
a-b-c2.5