【Java8】Stream整理

作者:Leopold    访问量:10

本文主要讲述Java8中,Stream相关的知识点和工作中遇到的问题。

1 排序

1.1 LocalDateTime排序

场景:按照列表中某对象的时间字段降序

resultBeforeList.stream()        
                    .sorted(Comparator.comparing(EduNotice::getNoticeTopTime).reversed())
                    .collect(Collectors.toList())

分析 :

  • sorted 源码
Stream<T> sorted(Comparator<? super T> comparator);

可以看到sorted接收的是函数式接口Function

  • comparing源码
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
        Function<? super T, ? extends U> keyExtractor)
{
    Objects.requireNonNull(keyExtractor);
    return (Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

可以看到comparing接收的是函数式接口Function,或者使用lambda 表达式传入。
此处我们使用EduNotice::getNoticeTopTime的方式传入,那么问题来了,为什么可以直接传入LocalDateTime,而不是通过lambda 表达式进行compareTo()

  • 我们首先查看LocalDateTime的声明:
public final class LocalDateTime
        implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable {

发现LocalDateTime类实现了ChronoLocalDateTime<LocalDate>接口。

  • 查看ChronoLocalDateTime接口:
public interface ChronoLocalDateTime<D extends ChronoLocalDate>
        extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDateTime<?>> {

发现ChronoLocalDateTime接口继承了Comparable接口,因此,使用EduNotice::getNoticeTopTime的方式传入自动实现了排序
在StackOverFlow中也有人回答了此为何会自动排序:

  • reversed()
    逆序


如果您觉得此文章对您有帮助,欢迎评论转载!

您的每一次评论与转载,都是对作者极大的鼓励!

注意:除非注明,否则均为[Leopold's Blog]原创文章,转载必须以链接形式标明本文链接。

本文链接:https://www.yusong.site/leopold/799.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注