Может кто-нибудь объяснить вывод приведенного ниже кода потоков Java:
List<Integer> l = new ArrayList<>();
l.add(0);
l.add(1);
l.add(2);
l.add(3);
l.add(4);
l.add(4);
l.stream()
.distinct()
.map(v -> {
System.out.println("In Map " + v);
return v;
}).forEach(v -> {
System.out.println("In ForEach " + v);
});
Я ожидал:
In Map 0
In Map 1
In Map 2
In Map 3
In Map 4
In ForEach 0
In ForEach 1
In ForEach 2
In ForEach 3
In ForEach 4
Но печатает:
In Map 0
In ForEach 0
In Map 1
In ForEach 1
In Map 2
In ForEach 2
In Map 3
In ForEach 3
In Map 4
In ForEach 4
Потоки - это ленивый, из источника извлекается по одному элементу, то, что вы видите, ожидаемо. Я на 100% уверен, что это дубликат ...




Я думаю, это довольно очевидно :) Это идет в Map, и для каждого значения выполняется вызов foreach. Это как вложенные циклы. Получите значение 1 - обработайте, получите значение 2 обработайте;) И вот что вы получите
Конвейер Stream оценивается лениво. Это означает, что он выполняет промежуточные операции с элементами Stream только тогда, когда такие элементы требуются для работы терминала - forEach в вашем случае.
Если для работы терминала требуется только один элемент (например, findFirst()), операция map() будет выполняться только для первого элемента Stream.
Есть ли причина, по которой вы так ожидали?