Сбор потока java имеет значение, является ли базовый поток параллельным или нет

#java #java-stream

#java #java-stream

Вопрос:

У меня есть следующая функция:

 public Stream getStream(boolean isParallel) {

...
return someSteamFromHere;
}
  

Эта функция вернет параллельный поток, если значение «isParallel» равно true, в противном случае последовательный поток. Теперь я хочу собрать этот параллельный / последовательный поток. Должна ли вызывающая функция реализовывать эту логику:

 boolean isParallel = isParallel();
Stream stream = getStream(isParallel);
List list;
if (isParallel) {
   list = stream.parallel().collect(Collectors.toList());
} else {
   list = stream.collect(Collectors.toList());
}
  

Или я могу просто собирать поток независимо, и если он параллельный, он будет собираться параллельно, а если последовательный, он будет собираться в одном потоке?

Комментарии:

1. Вас интересует порядок в результирующем списке?

2. Если getStream правильно возвращает параллельный поток, если isParallel true, то вызывающей стороне не нужно дублировать эту логику.

3. Порядок не имеет значения @Eritrean.

4. @LouisWasserman .. Спасибо. Удалит дублирующуюся логику.

Ответ №1:

параллелизм является свойством потока. Итак, если у вас есть параллельный поток, вызов этого не выполняется. .parallel() Он абсолютно ничего не делает.

Обратите внимание, что сбор параллельного потока подразумевает, что любая концепция «порядка» прямо из окна.

Ваш код может быть просто List list = stream.collect(Collectors.toList()); .

Обратите внимание, что, как правило, если параллелизм вообще имеет значение, сбор его в список кажется … странным. Какие бы преимущества в производительности, которые, по вашему мнению, вы получаете от параллельной обработки, в значительной степени уничтожаются, когда вы это делаете.

Комментарии:

1. Почему вы говорите, что преимущества производительности уничтожаются? Если промежуточные операции являются дорогостоящими, они все равно будут распараллелены.

2. Но показанный код вообще не выполняет никаких операций с элементами потока, кроме их сбора.

3. Я лениво выполняю промежуточные операции и хочу выполнять их параллельно, а затем последовательно работать с результирующим списком в одном потоке. Спасибо за объяснение.

Ответ №2:

Почему вы передаете логическое значение функции, если используете его после возврата функции? Либо функция получает логическое значение и использует его, либо не получает его, и тест остается снаружи, как вы написали. Кстати, функции с логическими параметрами считаются запахом кода, поскольку они явно выполняют несколько функций. Посмотрите здесь.

Комментарии:

1. Передача логического значения была просто для примера, чтобы объяснить, что я пытаюсь сделать. Фактический код работает по-другому.