В Java 8 интерфейс Collection был расширен двумя способами, которые возвращают Stream<E>
: stream()
, который возвращает последовательный поток и parallelStream()
, который возвращает возможно параллельный поток. Сам поток также имеет метод parallel()
, который возвращает эквивалентный параллельный поток (либо мутирующий текущий поток, либо параллельный, либо создающий новый поток).
У дублирования есть очевидные недостатки:
-
Это сбивает с толку. Вопрос запрашивает ли вызов как parallelStream(). Parallel() необходим, чтобы убедиться, что поток параллелен, учитывая, что parallelStream() может возвращать последовательный поток. Почему parallelStream() существует, если он не может гарантировать гарантию? Другой путь также запутан - если parallelStream() возвращает последовательный поток, возможно, есть причина (например, по сути последовательная структура данных, для которой параллельные потоки являются ловушкой производительности); что должен сделать Stream.parallel() для такого потока? (UnsupportedOperationException не допускается спецификацией parallel().)
-
Добавление методов к интерфейсу сопряжено с рисками, если существующая реализация имеет аналогично названный метод с несовместимым типом возврата. Добавление parallelStream() в дополнение к stream() удваивает риск небольшого выигрыша. (Обратите внимание, что parallelStream() был в одной точке с именем parallel(), хотя я не знаю, было ли оно переименовано, чтобы избежать конфликтов имен или по другой причине.)
Почему Collection.parallelStream() существует при вызове Collection.stream(). parallel() делает то же самое?