首页 > 解决方案 > 如果我在 Stream API 的 filter() 之后调用 limit() 会发生什么?

问题描述

下面的代码会过滤元素直到找到 3 个通过过滤方法的元素,还是过滤所有元素?

manyItems.stream()
    .filter(it -> it.getValue > 100)
    .limit(3)
    ...

标签: javajava-stream

解决方案


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()


推荐阅读