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

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

我有一个功能:

String fun(List<Function<String, String>> pro, String x){

     for(var p: pro){
         x = p.apply(x);
     }
     return x; 
}

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

gz5pxeao

gz5pxeao1#

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

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

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

functions.stream()
         .reduce(Function::andThen)
         .orElse(Function.identity())
         .apply(x)

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

jrcvhitl

jrcvhitl2#

我相信你已经意识到了这些编译错误。你不能只是定义 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();
}

相关问题