如何从数组创建并行流?
2022-09-01 11:35:49
我可以使用 或 从数组创建流。类似地,是否可以直接从数组创建 ParallelStream,而不创建中间集合,如 ?Arrays.stream(array)
Stream.of(values)
Arrays.asList(array).parallelStream()
我可以使用 或 从数组创建流。类似地,是否可以直接从数组创建 ParallelStream,而不创建中间集合,如 ?Arrays.stream(array)
Stream.of(values)
Arrays.asList(array).parallelStream()
Stream.of(array).parallel()
Arrays.stream(array).parallel()
TLDR;
任何顺序都可以通过调用它来转换为并行序列。因此,您所需要的只是:Stream
.parallel()
parallel()
长答案
这个问题已经很久了,但我相信一些额外的解释会让事情变得更加清晰。
Java 流的所有实现都实现了接口 。根据JavaDoc,它是:BaseStream
流的基本接口,流是支持顺序和并行聚合操作的元素序列。
从 API 的角度来看,顺序流和并行流之间没有区别。它们共享相同的聚合操作。
为了区分顺序流和并行流,聚合方法调用方法。BaseStream::isParallel
让我们探讨一下方法的实现:isParallel
AbstractPipeline
@Override
public final boolean isParallel() {
return sourceStage.parallel;
}
如您所见,唯一要做的就是在源代码阶段检查布尔标志:isParallel
/**
* True if pipeline is parallel, otherwise the pipeline is sequential; only
* valid for the source stage.
*/
private boolean parallel;
那么,该方法会做什么呢?它如何将顺序流转换为并行流?parallel()
@Override
@SuppressWarnings("unchecked")
public final S parallel() {
sourceStage.parallel = true;
return (S) this;
}
好吧,它只将标志设置为.这就是它所做的一切。parallel
true
如您所见,在 Java Stream API 的当前实现中,如何创建流(或将其作为方法参数接收)并不重要。您始终可以将流转换为零成本的并行流。