Ответ 1
Я думаю, что мы можем многому научиться из того, что это явное предложение было удалено. Этот вопрос, по-видимому, тесно связан с вопросом "Does Stream.forEach уважают порядок очередей последовательных потоков?" . Ответ от Брайана Гетца в основном говорит о том, что, несмотря на то, что не существует сценария, когда порядок игнорируется текущей реализацией потоков, когда forEach
вызывается в последовательном потоке, forEach
имеет право игнорировать порядок встреч даже для последовательных потоков по каждой спецификации.
Теперь рассмотрим следующий раздел Stream
документация классов:
Для выполнения вычислений потоковые операции объединяются в конвейер потока. Конвейер потока состоит из источника (который может быть массивом, коллекцией, функцией генератора, каналом ввода-вывода и т.д.), Ноль или более промежуточных операций (которые преобразуют поток в другой поток, например
filter(Predicate)
), и операцию терминала (которая дает результат или побочный эффект, напримерcount()
илиforEach(Consumer)
). Потоки ленивы; вычисление исходных данных выполняется только при инициировании операции терминала, а исходные элементы потребляются только по мере необходимости.
Поскольку это операция терминала, которая определяет, нужны ли элементы и нужны ли они в порядке встречи, свобода терминальных действий игнорировать порядок встреч также подразумевает потребление и, следовательно, обработку элементов в произвольном порядке.
Обратите внимание, что это может сделать не только forEach
. A Collector
имеет возможность сообщать о UNORDERED
характеристике, например. Collectors.toSet()
не зависит от порядка встреч. Очевидно, что также операция типа count()
не зависит от порядка в Java 9, она может даже вернуться без какой-либо обработки элементов. Подумайте о IntStream#sum()
для другого примера.
В прошлом реализация слишком стремилась к распространению неупорядоченной характеристики потока, см. "Это ошибка в Files.lines(), или я что-то недопонимаю параллельные потоки?" , где операция терминала повлияла на результат шага skip
, что является причиной того, что текущая реализация неохотно относится к такой оптимизации, чтобы избежать подобных ошибок, но это не исключает появления таких оптимизаций, затем выполняются с большей осторожностью...
Итак, на данный момент трудно представить, как реализация может получить выгоду от использования свободы неупорядоченных оценок в последовательном потоке, но, как указано в вопросе forEach
, это не подразумевает никаких гарантий.