2
我有以下列表integers
(所有的数字从0到999,999):为什么顺序流和并行流的缩减结果不同?
List<Integer> integers = new ArrayList<>();
for (int i = 0; i != 10_000_000; ++i) {
integers.add(i);
}
我试图运行下面作为Java 8个流:
int sum = 0;
for (Integer i : integers) {
sum = i % 2 == 0 ? i - sum : i + sum;
}
System.out.println(sum);
我期待下面的输出:
0 - 0 = 0
1 + 0 = 1
2 - 1 = 1
3 + 1 = 4
4 - 4 = 0
5 + 0 = 5
6 - 5 = 1
7 + 1 = 8
8 - 8 = 0
...
999,998 - 999,997 = 1
999,999 + 1 = 10,000,000
10,000,000
(顺便说一句,有人可以也许数学表达这个我不能......?)
如果我运行此:
int sum = integers.stream().reduce(
0,
(sum, i) -> i % 2 == 0 ? i - sum : i + sum
);
sum
是预期的量,10,000,000
。
但是,如果我改变流平行:
int sum = integers.parallelStream().reduce(
0,
(sum, i) -> i % 2 == 0 ? i - sum : i + sum
);
sum
是0
!
我似乎无法弄清楚为什么是这种情况,有人可以解释这一点吗?
这对我来说仍然很有趣**为什么**它总是** 0。 –