Java 使用stream和parallelStream减少相同的数据数组时会产生不同的结果?

Java 使用stream和parallelStream减少相同的数据数组时会产生不同的结果?,java,java-8,Java,Java 8,我在具有相同lambda表达式的同一数组上使用了reduce with stream和parallelStream,我期望得到相同的结果,但输出不同。然而,结果是不同的,我不知道为什么 守则: System.out.println("Reduce me..."); Integer[] arrx = {1,2,3,4}; // Reducing the Array Arrays .stream(arrx)

我在具有相同lambda表达式的同一数组上使用了reduce with stream和parallelStream,我期望得到相同的结果,但输出不同。然而,结果是不同的,我不知道为什么

守则:

    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

您的
reduce
操作取决于数组元素的遭遇顺序


parallelStream
忽略该顺序,每次调用并行执行时都会收到不同的值。

顺序流是确定性的,这意味着我们知道它执行的操作顺序:

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

下次您可能会得到不同的顺序,从而得到不同的结果。

您研究过
stream
parallelStream
之间的区别吗?如果你已经知道这是造成不同结果的原因,@Gatusko的可能复制品,它可能不是一个精确的复制品,但从这个问题中肯定有很多东西需要学习。谢谢你的链接。酷,我知道了!感谢并行流不会忽略顺序。它假定您正在通过一个要减少的,如。如果你遵守合同,你会得到正确的结果。例如,
String::concat
取决于元素的顺序,但它是一个关联函数,可以完美地与parallel
reduce
配合使用。