使用for或for每个循环循环/链接多个Function.applyHen()或Function.apply()



我有一个通用方法,它接受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

相关内容

  • 没有找到相关文章