为了账号安全,请及时绑定邮箱和手机立即绑定

如果我从流 API 在 filter() 之后调用 limit() 会发生什么情况?

如果我从流 API 在 filter() 之后调用 limit() 会发生什么情况?

千巷猫影 2022-08-03 16:02:25
下面的代码会筛选元素,直到找到 3 个通过筛选方法的元素,还是筛选所有元素?manyItems.stream()     .filter(it -> it.getValue > 100)     .limit(3)     ...
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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

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

我们可以通过调用来测试这一点:peek()

Arrays.stream(new int[] {1, 2, 2, 2, 2})
      .filter(e->  e > 1)
      .peek(System.out::println)
      .limit(3)
      .average();

(其中可以是任何本身不会短路的终端操作)average()

哪些输出:

2
2
2

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


查看完整回答
反对 回复 2022-08-03
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

该方法将首先应用过滤器,然后,之后,将对过滤的流调用限制。您可以轻松尝试编写测试。


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信