【问题标题】:Wrong result when using parallelStream().reduce()使用 parallelStream().reduce() 时结果错误
【发布时间】:2017-02-19 19:36:32
【问题描述】:

我想将列表的所有元素相乘,然后使用 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(),那么它会生成错误的值。为什么?在这种情况下,为什么并行化会产生错误的结果?解决方法是什么?

【问题讨论】:

标签: java java-8 java-stream


【解决方案1】:

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

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

5 * t 对于所有 t 值都不等于 t。

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

【讨论】:

  • 但是为什么在迭代解决方案的情况下会产生正确的结果?
  • 因为在这种情况下标识只使用一次,但在并行流中使用了多次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2018-07-11
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多