[英]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());
或者使用比较器首先或最后处理空值 - nullsFirst和nullsLast
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.