并行流是否可能给出与Java 8中串行流不同的结果?根据我的信息,并行流与串行流相同,只是分为多个子流。这是速度的问题。元素上的所有操作都已完成,并且子流的结果最终合并在一起。最后,我认为并行和串行流的运算结果应该相同。所以我的问题是,这段代码是否有可能给我带来不同的结果?如果有可能,为什么会发生呢?

int[] i = {1, 2, 5, 10, 9, 7, 25, 24, 26, 34, 21, 23, 23, 25, 27, 852, 654, 25, 58};
Double serial = Arrays.stream(i).filter(si -> {
    return si > 5;
}).mapToDouble(Double::new).map(NewClass::add).reduce(Math::atan2).getAsDouble();

Double parallel = Arrays.stream(i).filter(si -> {
    return si > 5;
}).parallel().mapToDouble(Double::new).map(NewClass::add).reduce(Math::atan2).getAsDouble();

System.out.println("serial: " + serial);
System.out.println("parallel: " + parallel);
public static double add(double i) {
    return i + 0.005;
}

结果是:
serial: 3.6971567726175894E-23

parallel: 0.779264049587662

最佳答案

reduce() 的Javadoc说:

单词"associative"链接到该Java文档:

正如@PaulBoddington在评论中提到的那样,atan2不具有关联性,因此对于归约运算无效。

无关
您的视频流顺序有些偏离。您应该在并行操作之后进行过滤,lambda可以缩短,并且不应该将double装箱:

double parallel = Arrays.stream(i)
                        .parallel()           // <-- before filter
                        .filter(si -> si > 5) // <-- shorter
                        .asDoubleStream()     // <-- not boxing
                        .reduce(Math::atan2)
                        .getAsDouble();

09-26 08:22