Java 从集合中获取并行流

Java 从集合中获取并行流,java,java-8,java-stream,Java,Java 8,Java Stream,使用Java8时,您需要执行以下代码才能从集合中获得并行流,这是否正确 private <E> void process(final Collection<E> collection) { Stream<E> stream = collection.parallelStream().parallel(); //processing } 私有作废流程(最终收集){ Stream=collection.parallelStream().paral

使用Java8时,您需要执行以下代码才能从
集合中获得并行流,这是否正确

private <E> void process(final Collection<E> collection) {
    Stream<E> stream = collection.parallelStream().parallel();
    //processing
}
私有作废流程(最终收集){
Stream=collection.parallelStream().parallel();
//加工
}
集合
API:

默认流parallelStream()

返回一个可能与此集合并行的流作为其源。此方法允许返回顺序流

BaseStream
API:

S parallel()

返回并行的等效流。可能会返回自身,这可能是因为流已经是并行的,也可能是因为底层流状态被修改为并行的


我需要调用一个假定将流并行化两次的函数,这不是很尴尬吗?

基本上是
集合的默认实现。parallelStream()
确实创建了一个并行流。实现如下所示:

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}
对于该类的对象,以下代码将按预期打印
false

ArrayList<String> arrayList = new MySequentialArrayList();
System.out.println(arrayList.parallelStream().isParallel());
这是
AbstractPipeline#parallel()
方法的实现

因此,相同对象的以下代码将打印
true

public final S parallel() {
    sourceStage.parallel = true;
    return (S) this;
}
System.out.println(arrayList.parallelStream().parallel().isParallel());

但是如果流已经是并行的,那么是的,它是一个额外的方法调用,但这将确保您始终获得一个并行流。我还没有深入研究流的并行化,所以我不能评论什么样的集合,或者在什么情况下,
parallelStream()
会给你一个顺序流。

不是所有的集合和流都支持并行执行,但是所有的集合和流都有这些。我想这就是为什么会有这些奇怪的文档。所以否。您不必同时调用这两个方法。@nosid但是,如果在不支持并行性的集合中调用此方法,则
parallelStream()
将返回一个顺序流,但
parallel()
的约定保证该流将是并行的。这会导致我需要调用这两种方法吗?
System.out.println(arrayList.parallelStream().parallel().isParallel());