Вы задаете неправильный вопрос. Вы спрашиваете о sequential
против, parallel
тогда как вы хотите обработать элементы по порядку , поэтому вы должны спросить о заказе . Если у вас есть заказанный поток и вы выполняете операции, которые гарантируют поддержание порядка, не имеет значения, обрабатывается ли поток параллельно или последовательно; Реализация будет поддерживать порядок.
Упорядоченное свойство отличается от параллельного и последовательного. Например , если вы звоните stream()
на HashSet
поток будет неупорядоченным при вызове stream()
на через List
возвращает упорядоченный поток. Обратите внимание, что вы можете позвонить, unordered()
чтобы освободить контракт на заказ и потенциально повысить производительность. Когда поток не имеет порядка, нет способа восстановить порядок. (Единственный способ превратить неупорядоченный поток в упорядоченный - это вызвать sorted
, однако результирующий порядок не обязательно является исходным.)
Смотрите также раздел «Заказ» в java.util.stream
документации пакета .
Чтобы обеспечить поддержание порядка на протяжении всей операции потока, вы должны изучить документацию об источнике потока, всех промежуточных операциях и операции терминала на предмет того, поддерживают ли они порядок или нет (или источник имеет порядок в первом место).
Это может быть очень тонким, например, Stream.iterate(T,UnaryOperator)
создает упорядоченный поток, в то время как Stream.generate(Supplier)
создает неупорядоченный поток. Обратите внимание, что вы также допустили распространенную ошибку в своем вопросе, поскольку не поддерживает порядок. Вы должны использовать, если вы хотите обработать элементы потока в гарантированном порядке.forEach
forEachOrdered
Так что если list
в вашем вопросе действительно a java.util.List
, его stream()
метод вернет упорядоченный поток и filter
не изменит порядок. Поэтому при вызове list.stream().filter() .forEachOrdered()
все элементы будут обрабатываться последовательно по порядку, тогда list.parallelStream().filter().forEachOrdered()
как элементы могут обрабатываться параллельно (например, фильтром), но действие терминала будет по-прежнему вызываться по порядку (что, очевидно, уменьшит преимущество параллельного выполнения). ,
Если вы, например, используете операцию, такую как
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
вся операция может выиграть от параллельного выполнения, но результирующий список всегда будет в правильном порядке, независимо от того, используете ли вы параллельный или последовательный поток.