Есть ли какая-либо гарантия того, что операции над последовательным и упорядоченным потоком обработаны в порядке встречи?
Я имею в виду, если у меня есть такой код:
IntStream.range(0, 5)
.map(i -> {
myFunction(i);
return i * 2;
})
.boxed()
.collect(toList());
есть ли гарантия, что он выполнит вызовы myFunction() в порядке выполнения сгенерированного диапазона?
Я нашел проект класса JavaDocs для потока, который прямо указывает на это:
Для последовательных поточных конвейеров все операции выполняются в порядке вызова источника конвейера, если источник конвейера имеет определенный порядок встреч.
но в официальном JavaDocs эта строка была удалена. Теперь он обсуждает порядок встреч только для выбранных методов. Пакет java.util.stream doc в разделе Побочные эффекты:
Даже когда конвейер ограничен для получения результата, который согласуется с порядком встречи источника потока (например,
IntStream.range(0,5).parallel().map(x -> x*2).toArray()
должен производить[0, 2, 4, 6, 8]
), никаких гарантий не делается относительно порядка, в котором преобразователь функция применяется к отдельным элементам или в каком потоке выполняется какой-либо поведенческий параметр для данного элемента.
но он ничего не говорит о последовательных потоках, а пример - для параллельного потока (я понимаю, что это верно как для последовательных, так и для параллельных потоков, но это та часть, о которой я не уверен).
С другой стороны, он также указывает в разделе Ordering:
Если поток упорядочен, большинство операций ограничено для работы с элементами в их порядке встречи; если источником потока является
List
, содержащий[1, 2, 3]
, тогда результат выполненияmap(x -> x*2)
должен быть[2, 4, 6]
. Однако, если источник не имеет определенного порядка регистрации, то любая перестановка значений[2, 4, 6]
будет действительным результатом.
но на этот раз он начинается с "работы с элементами", но пример относится к результирующему потоку, поэтому я не уверен, что они принимают побочные эффекты в учетной записи, а побочные эффекты - это действительно то, о чем этот вопрос.