Как обеспечить порядок обработки в потоках java8?
Я хочу обрабатывать списки внутри XML
объект java. Я должен обеспечить обработку всех элементов, чтобы я их получил.
поэтому я должен позвонить sequential
в каждом stream
использовать?
list.stream().sequential().filter().forEach()
или достаточно просто использовать поток, пока я не использовать параллелизм?
list.stream().filter().forEach()
2 ответа:
вы задаете неправильный вопрос. Вы спрашиваете о
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()
метод возвратить приказал Stream иfilter
не будет изменять порядок. Так что если вы позвонитеlist.stream().filter() .forEachOrdered()
, все элементы будут обрабатываться последовательно по порядку, тогда как дляlist.parallelStream().filter().forEachOrdered()
элементы могут обрабатываться параллельно (например, фильтром), но терминальное действие все равно будет вызываться по порядку (что, очевидно, уменьшит преимущество параллельного выполнения).если вы, например, используете операцию как
List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList());
вся операция может принести пользу из параллельного выполнения, но результирующий список всегда будет в правильном порядке, независимо от того, используете ли вы параллельный или последовательный поток.