下面的代码将筛选元素,直到它找到传递筛选方法的3个元素,还是过滤所有元素?
manyItems.stream()
.filter(it -> it.getValue > 100)
.limit(3)
...发布于 2019-03-12 15:03:18
filter()有延迟执行。这意味着当你调用它时,它实际上没有做任何正确的事情。相反,它只是返回一个新的Stream,它将包含在遍历时与给定的Predicate匹配的元素。
由于limit()是一个短路有状态中间操作,它将处理Stream,直到它达到极限和短路。这意味着当您调用filter时,它将返回一个只包含元素的新流。由于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(请注意,对filter()的调用后不会出现最后两个)
发布于 2019-03-12 15:00:59
该方法首先应用过滤器,然后调用过滤流的限制。你可以很容易地试着写一个测试。
https://stackoverflow.com/questions/55124390
复制相似问题