Java 8的流(streams)顺序执行和并行执行会产生不同的结果吗?
- 论坛
- Java 8的流(streams)顺序执行和并行执行会产生不同的结果吗?
7 浏览
Java 8的流(streams)顺序执行和并行执行会产生不同的结果吗?
在Java8中运行以下流示例:
System.out.println(Stream .of("a", "b", "c", "d", "e", "f") .reduce("", (s1, s2) -> s1 + "/" + s2) );
将得到结果:
/a/b/c/d/e/f
这当然不令人惊讶。根据[Java 8文档](http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html),流是否按顺序执行或并行执行并不重要:
> 除了明确标识为非确定性的操作(例如findAny()),流是按顺序执行还是并行执行不应改变计算结果。
据我所知,`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