将内部带有var的for-each循环转换为java流?

vqlkdk9b  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(451)

我有一个功能:

  1. String fun(List<Function<String, String>> pro, String x){
  2. for(var p: pro){
  3. x = p.apply(x);
  4. }
  5. return x;
  6. }

如何将此函数转换为函数式样式而不是命令式样式?

gz5pxeao

gz5pxeao1#

假设您希望将每个函数应用于字符串,并将每个函数的结果传递给下一个函数,您可以使用 reduce .

  1. String fun(List<Function<String, String>> functions, String x) {
  2. return functions.stream()
  3. .reduce(s -> s, Function::andThen)
  4. .apply(x);
  5. }

使用 reduceandThen 创建一个组合函数,将函数列表链接在一起。然后我们将组合函数应用于 x .
或者,评论中的@naman建议这样的表述:

  1. functions.stream()
  2. .reduce(Function::andThen)
  3. .orElse(Function.identity())
  4. .apply(x)

我相信这只会减少一个 andThen 操作(当函数列表为非空时),但在功能上与第一个版本相同。
( Function.identity() 是另一种写作方式 s -> s .)

展开查看全部
jrcvhitl

jrcvhitl2#

我相信你已经意识到了这些编译错误。你不能只是定义 List<Function<>> 对这些函数列表没有共同的理解。也许你可以从下面的代码片段中得到一些启发。

  1. String fun(List<Function<String, String>> listOfFunctions, String commonInputStr){
  2. for (Function<String, String> function : listOfFunctions) {
  3. String tempValStr = function.apply(commonInputStr);
  4. if (tempValStr != null){
  5. return tempValStr;
  6. }
  7. }
  8. return null;
  9. }

或者,如果您想找到如下所示的第一个结果值:

  1. Optional<String> fun(List<Function<String, String>> listOfFunctions, String commonInputStr){
  2. return listOfFunctions.stream()
  3. .map(stringStringFunction -> stringStringFunction.apply(commonInputStr))
  4. .findFirst();
  5. }
展开查看全部

相关问题