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

最佳答案

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

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

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

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

这暗示即使默认方法返回并行Stream,也可能存在Collections重写此方法以返回non-parallel Stream。这就是文档可能就是这样的原因。

同时,即使parallelStream返回顺序流-它仍然是Stream,然后您可以轻松地在其上调用parallel:
  Collections.some()
       .parallelStream() // actually sequential
       .parallel() // force it to be parallel

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

似乎该文档应该以某种方式声明在调用parallelStream之后,没有理由再次调用parallel来强制这样做-因为这可能对处理没有用甚至有害。

编辑

对于阅读此书的任何人,请同时阅读Holger的评论;它涵盖了我在此答案中未说过的情况。

10-07 23:13