java中parallelStream中的错误

有人可以告诉我为什么会发生这种情况,这是预期的行为还是错误

List<Integer> a = Arrays.asList(1,1,3,3);

a.parallelStream().filter(Objects::nonNull)
        .filter(value -> value > 2)
        .reduce(1,Integer::sum)

回答: 10

但是如果我们使用stream而不是parallelStream我得到正确的和预期的 answer 7

回答

reduce 的第一个参数称为“identity”而不是“initialValue”。

1根据加法是没有身份的。1是乘法的恒等式。

尽管您需要提供0是否要对元素求和。


Java 使用“identity”而不是“initialValue”,因为这个小技巧可以reduce很容易地并行化。


在并行执行中,每个线程将在流的一部分上运行reduce,当线程完成时,它们将使用相同的reduce函数组合。

虽然它看起来像这样:

mainThread:
  start thread1;
  start thread2;
  wait till both are finished;

thread1:
  return sum(1, 3); // your reduce function applied to a part of the stream

thread2:
  return sum(1, 3);

// when thread1 and thread2 are finished:
mainThread:
  return sum(sum(1, resultOfThread1), sum(1, resultOfThread2));
  = sum(sum(1, 4), sum(1, 4))
  = sum(5, 5)
  = 10

我希望你能看到会发生什么以及为什么结果不是你所期望的。


以上是java中parallelStream中的错误的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>