如何将函数列表应用于Java 8中的值?

n0r*_*m1e 9 java java-8

假设我有这个命令式代码:

    List<Function<T, T>> functions = ...
    T value = ...
    for (Function<T, T> function : functions) {
        value = function.apply(value);
    }
Run Code Online (Sandbox Code Playgroud)

我如何在功能样式中写这个(就像Scala中的折叠一样)?

Eug*_*ene 12

几个小时前刚刚问过这个Consumer...你可以将它们减少到一个函数并应用:

@SafeVarargs
private static <T> Function<T, T> combineF(Function<T, T>... funcs) {
    return Arrays.stream(funcs).reduce(Function.identity(), Function::andThen);
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,`reduce(Function.identity(),Function :: andThen)`将使用身份函数作为起始点,并为每个函数调用`andThen`,生成身份函数和下一个函数的组合函数(除非身份覆盖`andThen`,它在当前的JRE中不存在).相比之下,`reduce(Function :: andThen)`将返回单个元素流的唯一函数,并且只调用`andThen`,如果有多个函数,并且仅当流为空时才使用`identity()` . (6认同)
  • 虽然在语义上相同,`.reduce(Function :: andThen).orElse(Function.identity())`可能会产生稍微高效的函数. (5认同)
  • @srborlongan:它没有问题,但也没有节省,因为创建`Supplier`并不比调用`Function.identity()`便宜.如果在代码中的不同位置多次发生这种情况,那么净结果将是`orElse(Function.identity())`比`orElseGet(Function :: identity)`便宜.另请参见[... Function.identity()或t-> t](/sf/answers/1962903631/) (4认同)