Функция Java Unordered () - PullRequest
2 голосов
/ 09 июня 2019

В Java 8, когда я делаю,

Тип 1

list.stream().parallel().map(/**/).unordered().filter(/**/).collect(/**/);

Тип 2

list.stream().parallel().unordered().map(/**/).filter(/**/).collect(/**/);

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

Вопросы

1.В Type1 я говорю unordered () после операции map (). Итак, пытается ли операция map () обрабатывать 'ordering', потому что она до unOrdered ()?

2.В Type2, порядок не поддерживается по всей карте, верно, фильтр ops? Правильно ли мое понимание?

Ответы [ 2 ]

4 голосов
/ 09 июня 2019

Существует 3 Stream метода изменения состояния:

  • sequential()

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

  • parallel()

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

  • unordered()

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

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

Два ваших примера - это то же самое .Так что это будет:

list.stream().parallel().map(/**/).filter(/**/).unordered().collect(/**/);

list.stream().map(/**/).filter(/**/).unordered().parallel().collect(/**/);

list.stream().unordered().map(/**/).parallel().filter(/**/).collect(/**/);

list.stream().unordered().parallel().map(/**/).filter(/**/).collect(/**/);

Вы должны нажать на ссылку неупорядоченный и прочитать javadoc, чтобы узнать больше о упорядочении потоков.

3 голосов
/ 09 июня 2019

Эффект .unordered() состоит только в том, чтобы удалить ограничения для потока, чтобы он оставался упорядоченным.Поэтому на любые промежуточные операции в конвейере не влияет ограничение ordering .В приведенном примере при условии, что внутренние операции каждой из них не являются операциями с состоянием, .unordered() не имеет никакого эффекта.

Вот несколько полезных цитат из документов:

Операции с потоками :

Обход источника конвейера не начинается, пока не будет выполнена терминальная операция конвейера.

Таким образом, все эффекты промежуточных операций объединены иоперировать оптимизированным представлением входных данных.Это означает, что независимо от порядка промежуточной операции они влияют на всю работу конвейера одинаково .Это верно для параллельных или последовательных потоков.

Порядок :

Однако, если источник не имеет определенного порядка встречи, тогда любая перестановка значений [2, 4, 6] будет правильным результатом.

Это связано с вашим вопросом о T1 (поддержание порядка).В ваших конвейерах эта цитата означает, что нет ничего, что будет поддерживать порядок.

...