Reputation: 1658
I want to sort a list in reverse order by ZoneDateTime field, limit count by 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());
But got 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)
Upvotes: 2
Views: 8868
Reputation: 16910
It seems that visitDate in some of your dto objects was null. One solution is to filter out null elements :
visitViewDTOList.stream()
.filter(visitViewDTO -> visitViewDTO.getVisitDate() != null)
.sorted(Comparator.comparing(VisitViewDTO::getVisitDate).reversed())
.limit(20)
.collect(Collectors.toList());
Or use comparator which will deal with nulls first or last - nullsFirst and nullsLast
visitViewDTOList.stream()
.sorted(Comparator.comparing(VisitViewDTO::getVisitDate, Comparator.nullsFirst(Comparator.reverseOrder())))
.limit(20)
.collect(Collectors.toList());
Upvotes: 7
Reputation: 7175
As correctly pointed out by michalk, there can be some elements with visitDate=null
which may cause NullPointerException
So you may want to filter non null values,
visitViewDTOList.stream().filter(ele-> Objects.nonNull(ele.getVisitDate()))
.sorted(Comparator.comparing(VisitViewDTO::getVisitDate).reversed())
.limit(20).collect(Collectors.toList());
Upvotes: 1