Sob*_*jan 17 java arrays parallel-processing java-8 java-stream
我可以使用Arrays.stream(array)
或从数组创建一个Stream Stream.of(values)
.同样,是否可以直接从数组创建ParallelStream,而无需创建中间集合,如Arrays.asList(array).parallelStream()
?
Eug*_*ene 36
Stream.of(array).parallel()
Arrays.stream(array).parallel()
Run Code Online (Sandbox Code Playgroud)
TLDR;
任何顺序Stream
都可以通过调用.parallel()
它转换为并行。所以你只需要:
parallel()
就可以了。长答案
这个问题很老了,但我相信一些额外的解释会让事情变得更清楚。
Java 流的所有实现都实现了 interface BaseStream
。根据 JavaDoc 是:
流的基本接口,流是支持顺序和并行聚合操作的元素序列。
从 API 的角度来看,顺序流和并行流之间没有区别。它们共享相同的聚合操作。
为了区分顺序流和并行流,聚合方法调用BaseStream::isParallel
方法。
让我们探索isParallel
方法在 中的实现AbstractPipeline
:
@Override
public final boolean isParallel() {
return sourceStage.parallel;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,唯一要做的isParallel
就是检查源阶段的布尔标志:
/**
* True if pipeline is parallel, otherwise the pipeline is sequential; only
* valid for the source stage.
*/
private boolean parallel;
Run Code Online (Sandbox Code Playgroud)
那么这个parallel()
方法有什么作用呢?它如何将顺序流转换为并行流?
@Override
@SuppressWarnings("unchecked")
public final S parallel() {
sourceStage.parallel = true;
return (S) this;
}
Run Code Online (Sandbox Code Playgroud)
那么它只将parallel
标志设置为true
. 这就是它所做的一切。
如您所见,在 Java Stream API 的当前实现中,您如何创建流(或将其作为方法参数接收)并不重要。您始终可以以零成本将流转换为并行流。
归档时间: |
|
查看次数: |
5632 次 |
最近记录: |