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