public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
List<Integer> l = list.stream().filter(i -> i % 2 == 0).limit(10).sorted((i, j) -> j.compareTo(i))
.collect(Collectors.toList());
l.forEach(System.out::println);
}
这将过滤元素,直到达到极限10,然后对这10个元素进行排序。这种理解正确吗?
答案 0 :(得分:1)
从逻辑上讲,这意味着collect
将向limit
询问项目,limit
向filter
询问项目,filter
向stream
询问项目
流是惰性的,因为除非调用终端操作,否则不会评估中间操作。
中间操作返回一个新的流。他们总是很懒惰。执行诸如filter()
之类的中间操作实际上并不会执行任何过滤,而是会创建一个新的流,该流在遍历时将包含与给定谓词匹配的初始流的元素。在执行管道的终端操作之前,不会开始遍历管道源。
操作链从collect()
到filter()
的逆序懒惰求值,每个值在上一步产生后就立即消耗掉。