我有以下示例代码:
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),流的更多内容仍然通过过滤函数提供。
我试图理解为什么它是这样的,而不是像第一个例子一样计算第一个元素后放弃。任何有用的信息都将不胜感激。
https://stackoverflow.com/questions/29229373
复制相似问题