Текущая реализация не имеет никакого значения: .stream()
создает конвейер с parallel
набором поля для false
, то .parallel()
просто устанавливает это поле истины и возвращает тот же объект. При использовании .parallelStream()
он создает конвейер с полем parallel
, установленным в конструктор true
. Таким образом, обе версии одинаковы. Любые последующие вызовы .parallel()
или .sequential()
просто делают то же самое: измените флаг режима потока на true
или false
и верните тот же объект.
Ранняя реализация Stream API была иной. Here's Исходный код AbstractPipeline
(родительский для всех Stream
, IntStream
, LongStream
и DoubleStream
реализациях) в лямбда-dev незадолго до того, как была изменена логика. Установка режима на parallel()
сразу после создания потока из разделителя была относительно дешевой: он просто извлекает spliterator из исходного потока (depth == 0
ветвь в spliteratorSupplier()
), а затем создает новый поток в верхней части этого разделителя, отбрасывая исходный поток (те раз не было close()/onClose()
, поэтому было необязательно делегировать тесные обработчики).
Тем не менее, если ваш источник потока включен промежуточные этапы (например, рассмотреть Collections.nCopies
реализации, которая включает в себя map
шага), вещи были хуже: с помощью .stream().parallel()
бы create a new spliterator с бедным людьми стратегией расщепления (которая включает в себя буферизацию). Таким образом, для такой коллекции с использованием .parallelStream()
было фактически лучше, так как оно использовалось внутренне .parallel()
до промежуточная операция. В настоящее время даже для nCopies()
вы можете использовать как .stream().parallel()
, так и .parallelStream()
взаимозаменяемо.
Идет еще больше назад, вы may notice, что .parallelStream()
было вызвано просто .parallel()
изначально. Он был переименован в this changeset.
Но не было и небольшой разницы в синтаксисе - я помню, что читал что-то, что предполагало, что это было или было изменено для окончательной версии, так что вы могли бы вызвать collection.stream() или collection.parallel() и они изменили его на collection.parallelStream() и stream(). parallel(). Это всего лишь пример, но я думаю, что это было что-то вроде этого ... – Tranquility
Ну, идя еще более назад, вы [можете заметить] (http://hg.openjdk.java.net/lambda/lambda/jdk/file /cbef342202eb/src/share/classes/java/util/Collection.java#l491), что '.parallelStream()' первоначально назывался '.parallel()', если вы спрашиваете об этом. Он был переименован в [этот набор изменений] (http://hg.openjdk.java.net/lambda/lambda/jdk/rev/e41e14b4470a). –
Да, это было! Меня злило, поскольку я знал, что произошли перемены. Поэтому, когда он раньше назывался .parallel(), а не .parallelStream(), был ли еще stream(). Parallel(), то есть метод, который изменил последовательный поток, чтобы быть параллельным? Если это так, я думаю, именно поэтому они изменили его, поскольку в этом смысле был конфликт, и теперь это более очевидно. – Tranquility