java - 如果我在 Stream API 的 filter() 之后调用 limit() 会发生什么?
问题描述
下面的代码会过滤元素直到找到 3 个通过过滤方法的元素,还是过滤所有元素?
manyItems.stream()
.filter(it -> it.getValue > 100)
.limit(3)
...
解决方案
filter()
有延迟执行。这意味着当你调用它时它实际上并没有做任何正确的事情。相反,它只返回一个新的,它将包含在遍历时Stream
与给定匹配的元素。Predicate
由于limit()
是一个有状态的短路中间操作,它会一直处理Stream
直到达到极限并短路。这意味着当您调用 时filter
,它将返回一个新的 Stream ,该 Stream 只包含元素,当遍历时。由于limit
仅遍历足以达到给定大小,filter
因此实际上只会过滤掉所需数量的元素。
我们可以通过调用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
(注意最后两个不会出现在调用 to 之后filter()
)
推荐阅读
- azure - Jenkins 管道 - 在 ansible 和 Terraform 中引用 SSH Keys
- r - if_else 与have_labelled 列失败,因为错误的类
- javascript - 如何摆脱 v-on 处理程序中的错误:“TypeError:_vm.myFcn 不是函数”?
- javascript - 当我从下拉按钮中选择一个值时,其他值也会出现
- sas - SAS 中的 SUM() 来自同一个表 where 语句
- reactjs - NextJS getStaticProps 在开发重建时未更新
- ios - 如何在 Swift 本机代码中从 Flutter 调用参数?
- antlr - antlr4:访问者中的条件代码生成处理
- android - BLE <-> Android、iOS 设备通信是否需要绑定?
- python - 为什么str.removesuffix和str.removeprefix要复制