Java8 流顺序和并行执行产生不同的结果?
在 Java8 中运行以示例:
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.reduce("", (s1, s2) -> s1 + "/" + s2)
);
收益 率:
/a/b/c/d/e/f
当然,这并不奇怪。由于 http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html 流是按顺序执行还是并行执行并不重要:
除了标识为显式非确定性的操作(如 findAny())之外,流是按顺序执行还是并行执行,都不应更改计算结果。
AFAIK是确定性的,并且是关联的,因此添加应该产生相同的结果:reduce()
(s1, s2) -> s1 + "/" + s2
parallel()
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.parallel()
.reduce("", (s1, s2) -> s1 + "/" + s2)
);
但是,我的计算机上的结果是:
/a//b//c//d//e//f
这是怎么回事?
顺便说一句:使用(首选)而不是为顺序和并行执行产生相同的结果。.collect(Collectors.joining("/"))
reduce(...)
a/b/c/d/e/f
JVM 详细信息:
java.specification.version: 1.8
java.version: 1.8.0_31
java.vm.version: 25.31-b07
java.runtime.version: 1.8.0_31-b13