我在具有相同lambda表达式的同一数组上使用了带有stream和parallelStream的reduce,我期望的结果是相同的,但是输出是不同的。但是结果不同,我也不知道为什么。
代码:
System.out.println("Reduce me...");
Integer[] arrx = {1,2,3,4};
// Reducing the Array
Arrays
.stream(arrx)
.reduce((s1, s2) -> (int)Math.pow(s1,2) + (int)Math.pow(s2,2))
.ifPresent(System.out::println);
Arrays.asList(arrx)
.parallelStream()
.reduce((s1, s2) -> (int)Math.pow(s1,2) + (int)Math.pow(s2,2))
.ifPresent(System.out::println);
输出:
1172
650
答案 0 :(得分:7)
您的reduce
操作取决于数组元素的遇到顺序。
parallelStream
会忽略该顺序,并且每次调用并行执行时都会收到不同的值。
答案 1 :(得分:2)
顺序流是确定性的,这意味着我们知道它执行的操作顺序:
1^2 + 2^2 = 1 + 4 = 5
5^5 + 3^2 = 25 + 9 = 34
34^2 + 4^2 = 1156 + 16 = 1172
并行流可以按任何顺序减少元素。您观察到的650可能是通过以下操作实现的:
1^2 + 2^2 = 5
3^2 + 4^2 = 9 + 16 = 25
5^2 + 25^2 = 25 + 625 = 650
下次您可能会获得不同的订单,因此结果也会有所不同。