给我一首歌的时间@ 2021-08-20 10:19 采纳率: 50%
浏览 44

JDK1.8 的 limit和 sorted先后顺序对结果的影响

        String collect1 = Stream.of("a", "g", "v", "b", "c", "d", "e").sorted(String::compareTo).limit(4).collect(Collectors.joining(","));
        String collect2 = Stream.of("a", "g", "v", "b", "c", "d", "e").limit(4).sorted(String::compareTo).collect(Collectors.joining(","));
        log.info("limit返回排序后数据1: {}", collect1);
        log.info("limit返回排序后数据2: {}", collect2);

控制台输出:

09:35:04.836 [main] INFO com.huntkey.rx.sceo.streamapi.StreamApi - limit返回排序后数据1: a,b,c,d
09:35:04.836 [main] INFO com.huntkey.rx.sceo.streamapi.StreamApi - limit返回排序后数据2: a,b,g,v

如果按照我之前的理解把Stream API 当成一个 时间复杂度为 n(执行n次遍历) 来看的话, 即先所有排序完成后, 再对结果进行limit ; 这样理解结果符合预期, 但是从学习来看 应该是只执行了一次遍历, 参考下面代码:


                Stream.of("one", "two", "three", "four", "five").filter(x -> x.length() > 3).
                peek(x -> System.out.println("Filtered value:" + x)).map(String::toUpperCase)
                .peek(x -> System.out.println("Mapped value: " + x)).collect(Collectors.toList());

控制台输出:

Filtered value:three
Mapped value: THREE
Filtered value:four
Mapped value: FOUR
Filtered value:five
Mapped value: FIVE

因此stream的执过程相当于 对流数据中的元素分别调用 filter, peek, map, peek

那sorted 和 limit 又该怎么理解呢?

  • 写回答

1条回答 默认 最新

  • CSDN专家-sinJack 2021-08-20 11:09
    关注

    sorted()方法就是对集合进行排序。
    limit()函数就是取集合中的前n项。
    调用顺序不一样,得到的结果肯定就不一样了。
    这两个方法都直接操作集合,用jdk1.8之前的写法来理解的话,和集合同级别。
    filter, peek这些方法,属于集合操作内的,遍历集合,在集合内调用这些方法。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月20日