我有以下示例代码:
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()
,所以一旦我们有了第一个元素,我们的过滤 lambda 就不会被调用。
然而,在使用 flatMap
的第二种情况中,我们看到,尽管第一个元素满足过滤条件,但仍然可以找到(它只是任何第一个元素,因为 lambda 总是返回 true)流的进一步内容仍然通过过滤函数提供。
我试图理解它为什么会这样,而不是像第一种情况那样,在计算出第一个元素之后就放弃。 如有任何有用的信息将不胜感激。