2017-02-19 84 views
3

我想一個列表中的所有元素相乘在一起,然後通過5個使用流在Java中8這乘那結果是我的代碼:的錯誤結果使用parallelStream()時降低()

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

參見http://stackoverflow.com/q/28724850/2711488和http://stackoverflow.com/q/32866581/繁衍的結果2711488 – Holger

回答

12

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

身份值必須是累加器功能的身份。這意味着對於所有的t,accumulator.apply(identity,t)等於t。

5 * t不等於t對於t的所有值。

您應該使用1作爲身份,並通過5

+0

但是爲什麼它在迭代解決方案的情況下會產生正確的結果? –

+7

由於在這種情況下身份僅被使用一次,但在並行流中多次使用 –