并行流是否可能给出与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();