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

标签 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(),那么它会生成错误的值。为什么?为什么在这种情况下并行化会产生错误的结果?修复方法是什么?

最佳答案

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

The identity value must be an identity for the accumulator function. This means that for all t, accumulator.apply(identity, t) is equal to t.

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

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

关于java - 使用 parallelStream().reduce() 时的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42331899/

相关文章:

java - 如果将常量返回给 hashcode 并将 false 返回给 equals 会发生什么

java - CompletableFuture 对象数组的空检查

hashmap - Java8 总结到流的限制

多个参数的Java流averagingInt

java - Zk:如何创建具有数据绑定(bind)交互的 "load on demand"树?

java - Hibernate @OneToOne Mapping 不加入专栏?

java - 是否可以通过中间人攻击将代码注入(inject)通过网络传输的 Java 对象?

Java - BlockingQueue 卡住多线程应用程序

Java 8 ImageIO 在 Linux 中错误地读取 JPEG

Java 8 lambda API