首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么flatMap()之后的filter()在Java stream中是“不完全”惰性的?

为什么flatMap()之后的filter()在Java stream中是“不完全”惰性的?
EN

Stack Overflow用户
提问于 2015-03-24 17:46:54
回答 6查看 8.6K关注 0票数 79

我有以下示例代码:

代码语言:javascript
复制
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()
);

输出如下:

代码语言:javascript
复制
1
Result: 1
-----------
-1
0
1
0
1
2
1
2
3
Result: -1

从这里我可以看到,在第一种情况下,stream确实表现得很懒惰--我们使用findFirst(),所以一旦我们有了第一个元素,我们的过滤lambda就不会被调用。然而,在使用flatMap的第二种情况下,我们看到尽管找到了满足过滤条件的第一个元素(它只是任何第一个元素,因为lambda总是返回true),流的更多内容仍然通过过滤函数提供。

我试图理解为什么它是这样的,而不是像第一个例子一样计算第一个元素后放弃。任何有用的信息都将不胜感激。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29229373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档