Java 8函数编程中“ reduce”函数的第三个参数的目的


问题内容

在什么情况下Java 8流中会调用“ reduce”的第三个参数?

下面的代码尝试遍历字符串列表,并将每个字符串的第一个字符的代码点值相加。最终的lambda返回的值似乎从未使用过,并且,如果您插入println,则似乎永远不会调用它。该文档将其描述为“组合器”,但我找不到更多详细信息…

int result =
  data.stream().reduce(0, (total,s) -> total + s.codePointAt(0), (a,b) -> 1000000); 

问题答案:

您在说这个功能吗?

reduce <U> U reduce(U identity,
             BiFunction<U,? super T,U> accumulator,
             BinaryOperator<U> combiner) 

使用提供的标识,累积和组合功能,对此流的元素进行简化。这等效于:

 U result = identity;
 for (T element : this stream)
     result = accumulator.apply(result, element)
 return result;  
 ```

但不限于顺序执行。身份值必须是组合器功能的身份。这意味着对于所有u,combiner(identity,u)等于u。此外,组合器功能必须与累加器功能兼容;对于所有u和t,必须满足以下条件:

> 

combiner.apply(u, accumulator.apply(identity, t)) ==
accumulator.apply(u, t)
```

这是终端操作。

API注意:通过使用map和reduce操作的显式组合,可以更简单地表示使用这种形式的许多归约。累加器功能充当映射器和累加器的融合,有时比单独的映射和归约方法更有效,例如,当知道先前的降低值可以避免进行某些计算时。类型参数:U-结果的类型参数:identity-组合器函数累加器的标识值-关联,无干扰,无状态的功能,用于将附加元素合并到结果组合器中-关联,无干扰,无状态用于合并两个值的函数,这些值必须与累加器函数兼容返回:约简的结果另请参见:reduce(BinaryOperator),reduce(Object,BinaryOperator)

我以为它的目的是允许并行计算,所以我的猜测是只有在并行执行归约时才使用它。如果按顺序执行,则无需使用combiner。我不确定这一点-我只是基于文档注释“ […]不受顺序执行约束”以及注释中许多其他有关“并行执行”的说法。