Я могу создать поток из массива с помощью Arrays.stream(array)
или Stream.of(values)
. Аналогично, возможно ли создать ParallelStream непосредственно из массива без создания промежуточной коллекции, как в Arrays.asList(array).parallelStream()
?
Как создать параллельный поток из массива?
Ответ 1
Stream.of(array).parallel()
Arrays.stream(array).parallel()
Ответ 2
TLDR;
Любой последовательный Stream
можно преобразовать в параллельный, вызвав .parallel()
для него. Так что все, что вам нужно, это:
- Создать поток
- Вызовите метод
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 не имеет значения, как вы создаете поток (или получаете его в качестве параметра метода). Вы всегда можете превратить поток в параллельный с нулевой стоимостью.