java - 并行流与流并行

标签 java java-8 java-stream

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

最佳答案

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

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

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

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

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

同时甚至如果parallelStream返回一个顺序流——它仍然是一个Stream,那么你可以很容易地调用并行就可以了:

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

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

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

编辑

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

关于java - 并行流与流并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811182/

相关文章:

java - 对象输入流读取对象 EOFException

java - 从索引创建子列表

java - 收集器收集java中的pair列表

java - 如何使用流 API 根据条件对行进行排序

java - 如何通过检查 Java 内部列表中的值来对列表进行排序?

java - 使用日期类型列创建 Google 可视化数据表时出现 TypeMismatchException

java - Json类型不匹配: Cannot convert to string

java - 类 "com.mysql.jdbc.LocalizedErrorMessages"与同一包中其他类的信任级别不匹配

java - 为什么 Collections.sort(List) 在 Java 8 中使用 CopyOnWriteArrayList 而在 Java 7 中不起作用?

java - 使用 Java 8 Lambda 表达式将字符串数组转换为 Map