Ви ставите неправильне запитання. Ви запитуєте про 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());
вся операція може отримати вигоду від паралельного виконання, але отриманий список завжди буде в правильному порядку, незалежно від того, використовуєте ви паралельний чи послідовний потік.