使用parallelStream()时的错误结果.reduce()

时间:2017-02-19 19:36:32

标签: java java-8 java-stream

我希望将列表中的所有元素相乘,然后使用Java 8中的流将该结果乘以5.这是我的代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int mul = numbers.stream().reduce(5, (acc, x) -> x * acc);
System.out.println(mul);

这给了我正确的结果,120。但如果我们将其更改为parallelStream(),那么它会生成错误的值。为什么?在这种情况下,为什么并行化会产生错误的结果?什么是修复?

1 个答案:

答案 0 :(得分:12)

因为您不尊重preconditions of the reduce()方法:

  

标识值必须是累加器函数的标识。这意味着对于所有t,accumulator.apply(identity,t)等于t。

对于t的所有值,

5 * t不等于t。

您应该使用1作为标识,并将结果乘以5.