相关疑难解决方法(0)

Java8流顺序和并行执行产生不同的结果?

在Java8中运行以下流示例:

    System.out.println(Stream
        .of("a", "b", "c", "d", "e", "f")
        .reduce("", (s1, s2) -> s1 + "/" + s2)
    );
Run Code Online (Sandbox Code Playgroud)

收益率:

/a/b/c/d/e/f
Run Code Online (Sandbox Code Playgroud)

这是 - 当然 - 毫不奇怪.由于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)
    );
Run Code Online (Sandbox Code Playgroud)

但是我机器上的结果是:

/a//b//c//d//e//f
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

BTW:使用(首选).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
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

48
推荐指数
2
解决办法
3030
查看次数

标签 统计

java ×1

java-8 ×1

java-stream ×1

lambda ×1