繁体   English   中英

Java Stream:按 ZoneDateTime 字段排序

[英]Java Stream: sorting by ZoneDateTime field

我想按 ZoneDateTime 字段以相反的顺序对列表进行排序,将计数限制为 20

    public class VisitViewDTO implements Serializable {
      private ZonedDateTime visitDate;
      private int count;

      public ZonedDateTime getVisitDate() {
        return visitDate;
    }
}

.....

List<VisitViewDTO> visitViewDTOList;

visitViewDTOList.stream().sorted(Comparator.comparing(VisitViewDTO::getVisitDate).reversed()).limit(20).collect(Collectors.toList());

但是得到了 NPE:

java.lang.NullPointerException: null
    at java.time.chrono.ChronoZonedDateTime.compareTo(ChronoZonedDateTime.java:570)
    at java.time.chrono.ChronoZonedDateTime.compareTo(ChronoZonedDateTime.java:121)
    at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
    at java.util.Collections$ReverseComparator2.compare(Collections.java:5178)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:356)
    at java.util.TimSort.sort(TimSort.java:220)
    at java.util.Arrays.sort(Arrays.java:1512)     

您的某些 dto 对象中的 visitDate 似乎为空。 一种解决方案是过滤掉空元素:

visitViewDTOList.stream()
                .filter(visitViewDTO -> visitViewDTO.getVisitDate() != null)
                .sorted(Comparator.comparing(VisitViewDTO::getVisitDate).reversed())
                .limit(20)
                .collect(Collectors.toList());

或者使用比较器首先或最后处理空值 - nullsFirstnullsLast

visitViewDTOList.stream()
                .sorted(Comparator.comparing(VisitViewDTO::getVisitDate, Comparator.nullsFirst(Comparator.reverseOrder())))
                .limit(20)
                .collect(Collectors.toList());

正如 michalk 正确指出的那样,可能有一些带有visitDate=null元素可能导致NullPointerException所以你可能想要过滤非空值,

 visitViewDTOList.stream().filter(ele-> Objects.nonNull(ele.getVisitDate()))
                .sorted(Comparator.comparing(VisitViewDTO::getVisitDate).reversed())
                .limit(20).collect(Collectors.toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM