首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java8 streams顺序和并行执行会产生不同的结果吗?

Java8 streams顺序和并行执行会产生不同的结果吗?
EN

Stack Overflow用户
提问于 2015-02-26 00:52:36
回答 3查看 3.3K关注 0票数 48

在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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28724850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档