首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我将在Stream的filter()之后调用limit(),会发生什么?

问如果我将在Stream的filter()之后调用limit(),会发生什么?
EN

Stack Overflow用户
提问于 2019-03-12 14:50:44
回答 2查看 1.5K关注 0票数 1

下面的代码将筛选元素,直到它找到传递筛选方法的3个元素,还是过滤所有元素?

代码语言:javascript
复制
manyItems.stream()
    .filter(it -> it.getValue > 100)
    .limit(3)
    ...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-12 15:03:18

filter()有延迟执行。这意味着当你调用它时,它实际上没有做任何正确的事情。相反,它只是返回一个新的Stream,它将包含在遍历时与给定的Predicate匹配的元素。

由于limit()是一个短路有状态中间操作,它将处理Stream,直到它达到极限和短路。这意味着当您调用filter时,它将返回一个只包含元素的新流。由于limit的遍历量仅足以达到给定的大小,因此filter实际上只过滤掉所需的元素数量。

我们可以通过调用peek()来测试这个

代码语言:javascript
复制
Arrays.stream(new int[] {1, 2, 2, 2, 2})
      .filter(e->  e > 1)
      .peek(System.out::println)
      .limit(3)
      .average();      

(其中average()可以是任何不自己短路的终端操作)

其中产出:

代码语言:javascript
复制
2
2
2

(请注意,对filter()的调用后不会出现最后两个)

票数 2
EN

Stack Overflow用户

发布于 2019-03-12 15:00:59

该方法首先应用过滤器,然后调用过滤流的限制。你可以很容易地试着写一个测试。

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

https://stackoverflow.com/questions/55124390

复制
相关文章

相似问题

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