Вы задаете неправильный вопрос. Вы спрашиваете о 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());
вся операция может выиграть от параллельного выполнения, но результирующий список всегда будет в правильном порядке, независимо от того, используете ли вы параллельный или последовательный поток.
List<>
, сохранит порядок, но будетCollection<>
ли?Set
обычно нет, если только этоSortedSet
илиLinkedHashSet
. Взгляды ВзиманиеMap
(keySet()
,entrySet()
иvalues()
) НаследоватьMap
политики «s, т.е. упорядочены , когда карта являетсяSortedMap
илиLinkedHashMap
. Поведение определяется характеристиками, представленными сплитератором коллекции .default
РеализацияCollection
не сообщаетORDERED
характеристики, так что это неупорядоченное, если не отменено.forEachOrdered
отличается толькоforEach
при использовании параллельных потоков - но хорошая практика использовать его в любом случае при заказе имеет значение в случае, если метод обработки паром когда-либо изменится ...В двух словах:
Порядок зависит от исходной структуры данных и операций промежуточного потока. Предполагая, что вы используете,
List
процесс должен быть упорядочен (посколькуfilter
здесь последовательность не изменится).Больше деталей:
Последовательный и параллельный против неупорядоченного:
Javadocs
Заказ потока:
Javadocs
источник