parallelStream vs stream.parallel

2022-08-31 21:02:36

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


答案 1

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

目前,该方法在接口中定义为:parallelStreamCollection

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

作为默认方法,它可以在实现中被重写(这就是内部类实际执行的操作)。Collections

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

同时,即使返回顺序流 - 它仍然是一个,然后您可以轻松调用它:parallelStreamStreamparallel

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

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

似乎文档应该以某种方式声明,在调用后,应该没有理由再次调用以强制这样做 - 因为它可能对处理无用甚至不利。parallelStreamparallel

编辑

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


答案 2

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


推荐