在流操作中执行排序操作

时间:2019-01-10 12:30:53

标签: java

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个元素进行排序。这种理解正确吗?

1 个答案:

答案 0 :(得分:1)

从逻辑上讲,这意味着collect将向limit询问项目,limitfilter询问项目,filterstream询问项目

是惰性的,因为除非调用终端操作,否则不会评估中间操作。

中间操作返回一个新的流。他们总是很懒惰。执行诸如filter()之类的中间操作实际上并不会执行任何过滤,而是会创建一个新的流,该流在遍历时将包含与给定谓词匹配的初始流的元素。在执行管道的终端操作之前,不会开始遍历管道源。

操作链从collect()filter()的逆序懒惰求值,每个值在上一步产生后就立即消耗掉。