使用流和parallelStream减少同一数据数组时,结果不同吗?

时间:2018-06-20 14:50:01

标签: java java-8

我在具有相同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

2 个答案:

答案 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

下次您可能会获得不同的订单,因此结果也会有所不同。