我有以下示例代码:
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
s的第二种情况下,我们看到尽管找到了满足过滤条件的第一个元素(因为lambda始终返回true,所以它只是任何第一个元素),流的其他内容仍通过过滤功能馈送。
我试图理解为什么它会像这样,而不是像第一种情况那样在计算第一个元素之后就放弃了。任何有用的信息将不胜感激。