Ви ставите неправильне запитання. Ви запитуєте про sequentialпорівняно, parallelтоді як ви хочете обробляти елементи в порядку , тому вам доведеться запитати про замовлення . Якщо у вас є упорядкований потік і виконуються операції, які гарантують підтримання порядку, не має значення, обробляється він паралельно або послідовно; реалізація буде підтримувати порядок.
Впорядкована властивість відрізняється від паралельної проти послідовної. Наприклад , якщо ви телефонуєте stream()на HashSetпотік буде неврегульованим при виклику stream()на через Listповертає впорядкований потік. Зауважте, що ви можете зателефонувати, unordered()щоб розірвати договір замовлення та потенційно збільшити продуктивність. Після того, як потік не має замовлення, немає можливості відновити замовлення. (Єдиний спосіб перетворити не упорядкований потік у впорядкований - зателефонувати sorted, однак отримане замовлення не обов’язково є оригінальним замовленням).
Дивіться також розділ «Замовлення» java.util.streamдокументації на упаковку .
Щоб забезпечити підтримку впорядкування протягом усієї операції потоку, ви повинні вивчити документацію джерела потоку, усі проміжні операції та операції терміналу, чи підтримують вони порядок чи ні (або джерело має впорядкування в першому місце).
Це може бути дуже тонким, наприклад , Stream.iterate(T,UnaryOperator)створює упорядкований потік , а Stream.generate(Supplier)створює невпорядкований потік. Зауважте, що ви також зробили поширену помилку у своєму питанні, оскільки не підтримуєте впорядкованість. Ви повинні використовувати, якщо ви хочете обробляти елементи потоку в гарантованому порядку.forEach forEachOrdered
Тож якщо ваш listзапитання справді є java.util.List, його stream()метод поверне впорядкований потік і filterне змінить замовлення. Отже, якщо ви зателефонуєте list.stream().filter() .forEachOrdered(), всі елементи будуть оброблятися послідовно в порядку, тоді як для list.parallelStream().filter().forEachOrdered()елементів можна обробляти паралельно (наприклад, фільтром), але термінальна дія все одно буде викликана в порядку (що, очевидно, зменшить вигоду від паралельного виконання) .
Якщо ви, наприклад, використовуєте операцію типу
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
вся операція може отримати вигоду від паралельного виконання, але отриманий список завжди буде в правильному порядку, незалежно від того, використовуєте ви паралельний чи послідовний потік.