У меня есть следующий пример кода:
System.out.println(
"Result: " +
Stream.of(1, 2, 3)
.filter(i -> {
System.out.println(i);
return true;
})
.findFirst()
.get()
);
System.out.println("-----------");
System.out.println(
"Result: " +
Stream.of(1, 2, 3)
.flatMap(i -> Stream.of(i - 1, i, i + 1))
.flatMap(i -> Stream.of(i - 1, i, i + 1))
.filter(i -> {
System.out.println(i);
return true;
})
.findFirst()
.get()
);
Выход выглядит следующим образом:
1
Result: 1
-----------
-1
0
1
0
1
2
1
2
3
Result: -1
Отсюда я вижу, что в первом случае stream действительно ведет себя лениво - мы используем findFirst(), поэтому, как только у нас есть первый элемент, наша фильтрационная лямбда не вызывается.
Однако во втором случае, который использует flatMap, мы видим, что, несмотря на то, что первый элемент, который удовлетворяет условию фильтра, найден (он только любой первый элемент, поскольку lambda всегда возвращает true), дальнейшее содержимое потока все еще подается через функцию фильтрации.
Я пытаюсь понять, почему он ведет себя так, а не отказывается после того, как первый элемент вычисляется, как в первом случае. Любая полезная информация была бы оценена.