如何从阵列创建并行流?

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)

  • @Siddhartha 并行并不意味着更快,是的。 (3认同)

ETO*_*ETO 5

TLDR;

任何顺序Stream都可以通过调用.parallel()它转换为并行。所以你只需要:

  1. 创建一个流
  2. 调用方法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 的当前实现中,您如何创建流(或将其作为方法参数接收)并不重要。您始终可以以零成本将流转换为并行流。