【问题标题】:How can I create a parallel stream from an array?如何从数组创建并行流?
【发布时间】:2016-12-02 13:29:37
【问题描述】:

我可以使用Arrays.stream(array)Stream.of(values) 从数组创建流。类似地,是否可以直接从数组创建 ParallelStream,无需创建中间集合,如 Arrays.asList(array).parallelStream() 中那样?

【问题讨论】:

  • Arrays.stream(array).parallel()?我想你也可以有StreamSupport.stream(Arrays.spliterator(array), true),但为什么要让它变得复杂呢?
  • 每个流都可以通过parallel()方法转换为并行。所以你可以简单地使用Stream.of(elements).parallel()
  • @Pshemo 不是字符串,而是 stream
  • @Eugene 谢谢,已修复。

标签: java arrays parallel-processing java-8 java-stream


【解决方案1】:
  Stream.of(array).parallel() 

  Arrays.stream(array).parallel()

【讨论】:

  • 有趣的是,我将它添加到我的一个程序中,它将运行时间从 13 毫秒提高到 90 毫秒。这是在 leetcode 上的,我猜他们的很多测试用例都比较小,其中并行化带来的开销比实际加速任何东西都要多 - i.imgur.com/sHc8lLG.png
  • @Siddhartha 并行并不意味着更快,是的。
【解决方案2】:

TLDR;

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

  1. 创建流
  2. 调用方法parallel()就可以了。

长答案

这个问题已经很老了,但我相信一些额外的解释会让事情变得更清楚。

Java 流的所有实现都实现了接口BaseStream。根据 JavaDoc 是:

流的基本接口,它是支持顺序和并行聚合操作的元素序列。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多