为什么存在Collection.parallelStream()函数,当使用.stream().parallel()也能达到同样的效果呢?

10 浏览
0 Comments

为什么存在Collection.parallelStream()函数,当使用.stream().parallel()也能达到同样的效果呢?

在Java 8中,集合接口通过两个返回Stream的方法进行了扩展:stream()返回一个顺序流,parallelStream()返回一个可能并行的流。Stream本身也有一个parallel()方法,返回一个等效的并行流(要么将当前流转变为并行流,要么创建一个新的流)。

这种重复有明显的缺点:

  • 这让人感到困惑。一个问题问到是否需要同时调用parallelStream().parallel()才能确保流是并行的,考虑到parallelStream()可能返回一个顺序流。如果parallelStream()不能提供保证,为什么它存在呢?反过来也很困惑——如果parallelStream()返回一个顺序流,可能有一个原因(例如,一个本质上是顺序的数据结构,对于这种结构,并行流是一个性能陷阱);那么Stream.parallel()对于这样的流应该做什么?(parallel()的规范不允许UnsupportedOperationException)。
  • 在接口中添加方法存在冲突的风险,如果现有的实现具有同名方法但返回类型不兼容。除了stream()之外,还添加了parallelStream(),为了很小的收益而使冲突风险翻倍。(请注意,parallelStream()曾经只被命名为parallel(),尽管我不知道它是否被重命名是为了避免冲突或其他原因。)

既然调用Collection.stream().parallel()可以实现相同的功能,为什么还需要Collection.parallelStream()存在?

0