parallelStream 与 stream.parallel

新手上路,请多包涵

我一直很好奇 Collections.parallelStream()Collections.stream().parallel() 之间的区别。根据 Javadocs, parallelStream() 尝试返回并行流,而 stream().parallel() 返回并行流。通过我自己的一些测试,我没有发现任何差异。这两种方式的区别在哪里呢?一种实施方式是否比另一种更省时?谢谢。

原文由 Nick Clark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

即使他们 目前的 行为相同,也存在差异 - 至少在他们的文档中,正如您正确指出的那样;据我所知,将来可能会被利用。

目前 parallelStream 方法在 Collection 接口中定义为:

 default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

作为默认方法,它可以在实现中被覆盖(这就是 Collections 内部类实际上所做的)。

这暗示即使默认方法返回并行流,也可能有覆盖此方法的集合返回 non-parallel Stream 。这就是文档可能是这样的原因。

同时, 即使 parallelStream 返回一个顺序流 - 它仍然是一个 Stream ,然后你可以轻松调用 parallel

   Collections.some()
       .parallelStream() // actually sequential
       .parallel() // force it to be parallel

至少对我来说,这看起来很奇怪。

似乎文档应该以某种方式声明在调用 parallelStream 之后应该没有理由再次调用 parallel 来强制执行 - 因为它可能对处理无用甚至不利。

编辑

对于阅读本文的任何人 - 请同时阅读 Holger 的评论;它涵盖了超出我在此答案中所说的情况。

原文由 Eugene 发布,翻译遵循 CC BY-SA 4.0 许可协议

Collections.parallelStream()Collections.stream().parallel() 之间没有区别。它们都将流划分为底层拆分器允许的范围,并且它们都将使用默认值 ForkJoinPool 运行(除非已经在另一个内部运行)。

原文由 Joe C 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题