Имеет ли значение, где разместить вызов parallel() в потоковом конвейере?

#java #parallel-processing #java-stream

Вопрос:

Например, parallel() до того, как filter()

 Stream.of(...)
      .parallel()
      .filter(...)
      .forEach(...);
 

и parallel() после filter()

 Stream.of(...)
      .filter(...)
      .parallel()
      .forEach(...);
 

Влияет ли порядок вызова parallel() на поток?

Ответ №1:

Не имеет значения, где вы находитесь parallel() . Поток не оценивается до тех пор, пока не будет вызвана терминальная операция (в вашем случае forEach ).

Из Джавадока:

Возвращает эквивалентный параллельный поток. Может вернуться сам, либо потому, что поток уже был параллельным, либо потому, что базовое состояние потока было изменено на параллельное. Это промежуточная операция.

Единственная ситуация , в которой порядок имеет значение, — это если вы также звоните sequential , и в этом случае применяется следующее:

Последняя настройка последовательного или параллельного режима применяется к выполнению всего конвейера потока.

Для получения дополнительной информации см. соответствующий Javadoc