Параллелизм применяется ко всему конвейеру, поэтому вы не можете реально контролировать то, что будет выполнено до применения limit()
в параллельной Stream
.Единственная гарантия состоит в том, что то, что после limit()
будет выполнено только для сохраненных элементов.
Различие между ними, вероятно, связано с некоторыми деталями реализации или другими Stream
характеристиками.Фактически, вы можете легко изменить поведение, играя на характеристике SIZED
.Кажется, когда Stream
имеет известный размер, обрабатываются только 2 элемента.
Так, например, применение простого filter()
приведет к потере размера версии списка:
completeFirstTwoElements(
Stream.of("list one", "list two", "list three", "list four", "list five").filter(a -> true)
);
*Например, 1014 * выводит:
Running list one
Running list five
Running list two
Running list three
list one
list two
И без использования неизвестного размера версия Spliterator.spliterator()
"исправляет" поведение:
Iterator<String> iterator = Arrays.asList("iterator one", "iterator two", "iterator three", "iterator four", "iterator five").iterator();
completeFirstTwoElements(
StreamSupport.stream(Spliterators.spliterator(iterator, Spliterator.ORDERED, 5), false)
);
Вывод:
Running iterator two
Running iterator one
iterator one
iterator two