У меня есть следующий пример кода:
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), дальнейшее содержимое потока все еще подается через функцию фильтрации.
Я пытаюсь понять, почему он ведет себя так, а не отказывается после того, как первый элемент вычисляется, как в первом случае. Любая полезная информация была бы оценена.