Как создать параллельный поток из массива?

Я могу создать поток из массива с помощью Arrays.stream(array) или Stream.of(values). Аналогично, возможно ли создать ParallelStream непосредственно из массива без создания промежуточной коллекции, как в Arrays.asList(array).parallelStream()?

Ответ 1

  Stream.of(array).parallel() 

  Arrays.stream(array).parallel()

Ответ 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 не имеет значения, как вы создаете поток (или получаете его в качестве параметра метода). Вы всегда можете превратить поток в параллельный с нулевой стоимостью.