我希望将列表中的所有元素相乘,然后使用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()
,那么它会生成错误的值。为什么?在这种情况下,为什么并行化会产生错误的结果?什么是修复?
答案 0 :(得分:12)
因为您不尊重preconditions of the reduce()方法:
对于t的所有值,标识值必须是累加器函数的标识。这意味着对于所有t,accumulator.apply(identity,t)等于t。
5 * t不等于t。
您应该使用1作为标识,并将结果乘以5.