Как обеспечить порядок обработки в streamах java8?

Я хочу обрабатывать списки внутри XML объекта Java. Я должен обеспечить обработку всех элементов, чтобы я их получил.

Должен ли я поэтому звонить sequential в каждом stream я использую? list.stream().sequential().filter().forEach()

Или это достаточно, чтобы просто использовать stream, пока я не использую параллелизм? list.stream().filter().forEach()

Вы задаете неправильный вопрос. Вы спрашиваете о sequential или parallel тогда как вы хотите обрабатывать элементы по порядку , поэтому вам нужно спросить о заказе . Если у вас есть упорядоченный stream и выполняются операции, которые гарантируют поддержание порядка, не имеет значения, обрабатывается ли stream параллельно или последовательно; реализация будет поддерживать порядок.

Упорядоченное свойство отличается от параллельного и последовательного. Например, если вы вызываете stream() в HashSet stream будет неупорядоченным, а вызов stream() в List возвращает упорядоченный stream. Обратите внимание, что вы можете вызвать unordered() чтобы освободить контракт на заказ и потенциально увеличить производительность. Как только stream не имеет порядка, нет способа восстановить заказ. (Единственный способ превратить неупорядоченный stream в упорядоченный – это sorted вызов, однако полученный заказ не обязательно является первоначальным заказом).

См. Также раздел «Заказ» документации пакета java.util.stream .

Чтобы обеспечить поддержание порядка заказа в течение всей операции streamа, вам необходимо изучить документацию источника streamа, всех промежуточных операций и операции терминала для того, поддерживают ли они порядок или нет (или источник имеет порядок в первом место).

Это может быть очень тонким, например Stream.iterate(T,UnaryOperator) создает упорядоченный stream, а Stream.generate(Supplier) создает неупорядоченный stream. Обратите внимание, что вы также сделали распространенную ошибку в своем вопросе, так как forEach не поддерживает порядок. Вы должны использовать forEachOrdered если хотите обработать элементы streamа в гарантированном порядке.

Поэтому, если ваш list в вашем вопросе действительно является java.util.List , его метод stream() вернет упорядоченный stream, и filter не изменит порядок. Поэтому, если вы вызываете list.stream().filter() .forEachOrdered() , все элементы будут обрабатываться последовательно по порядку, тогда как для list.parallelStream().filter().forEachOrdered() элементы могут обрабатываться параллельно ( например, фильтром), но действие терминала все равно будет вызываться по порядку (что, очевидно, уменьшит преимущество параллельного выполнения).

Если вы, например, используете операцию типа

 List<…> result=inputList.parallelStream().map(…).filter(…).collect(Collectors.toList()); 

вся операция может выиграть от параллельного выполнения, но полученный список всегда будет в правильном порядке, независимо от того, используете ли вы параллельный или последовательный stream.

list.stream (). последовательный (). фильтр (). ForEach ()

всегда будет обрабатывать список, чтобы упорядочить список.

Однако, если мы используем

list.stream (). параллельно ()

то для остальных операций порядок не гарантируется.

  • Получение списка из java.util.stream.Stream в Java 8
  • Сбор последовательных пар из streamа
  • Почему filter () после того, как flatMap () «не полностью» ленив в streamах Java?
  • Как создать stream из массива?
  • Потоки последовательного и параллельного выполнения streamов Java8 дают разные результаты?
  • В Java, как эффективно и элегантно потопить потомков узла дерева?
  • forEach vs forEachOrdered в Java 8 Stream
  • Преобразование Iterable в Stream с использованием Java 8 JDK
  • Java 8 Iterable.forEach () vs foreach loop
  • Найти первый элемент по предикату
  • Обратный порядок streamа Java 8
  • Давайте будем гением компьютера.