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