我有一个功能:
String fun(List<Function<String, String>> pro, String x){ for(var p: pro){ x = p.apply(x); } return x; }
如何将此函数转换为函数式样式而不是命令式样式?
gz5pxeao1#
假设您希望将每个函数应用于字符串,并将每个函数的结果传递给下一个函数,您可以使用 reduce .
reduce
String fun(List<Function<String, String>> functions, String x) { return functions.stream() .reduce(s -> s, Function::andThen) .apply(x); }
使用 reduce 与 andThen 创建一个组合函数,将函数列表链接在一起。然后我们将组合函数应用于 x .或者,评论中的@naman建议这样的表述:
andThen
x
functions.stream() .reduce(Function::andThen) .orElse(Function.identity()) .apply(x)
我相信这只会减少一个 andThen 操作(当函数列表为非空时),但在功能上与第一个版本相同。( Function.identity() 是另一种写作方式 s -> s .)
Function.identity()
s -> s
jrcvhitl2#
我相信你已经意识到了这些编译错误。你不能只是定义 List<Function<>> 对这些函数列表没有共同的理解。也许你可以从下面的代码片段中得到一些启发。
List<Function<>>
String fun(List<Function<String, String>> listOfFunctions, String commonInputStr){ for (Function<String, String> function : listOfFunctions) { String tempValStr = function.apply(commonInputStr); if (tempValStr != null){ return tempValStr; } } return null; }
或者,如果您想找到如下所示的第一个结果值:
Optional<String> fun(List<Function<String, String>> listOfFunctions, String commonInputStr){ return listOfFunctions.stream() .map(stringStringFunction -> stringStringFunction.apply(commonInputStr)) .findFirst(); }
2条答案
按热度按时间gz5pxeao1#
假设您希望将每个函数应用于字符串,并将每个函数的结果传递给下一个函数,您可以使用
reduce
.使用
reduce
与andThen
创建一个组合函数,将函数列表链接在一起。然后我们将组合函数应用于x
.或者,评论中的@naman建议这样的表述:
我相信这只会减少一个
andThen
操作(当函数列表为非空时),但在功能上与第一个版本相同。(
Function.identity()
是另一种写作方式s -> s
.)jrcvhitl2#
我相信你已经意识到了这些编译错误。你不能只是定义
List<Function<>>
对这些函数列表没有共同的理解。也许你可以从下面的代码片段中得到一些启发。或者,如果您想找到如下所示的第一个结果值: