harp1814
harp1814

Reputation: 1658

Java Stream: sorting by ZoneDateTime field

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

Answers (2)

Michał Krzywański
Michał Krzywański

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

Vikas
Vikas

Reputation: 7175

As correctly pointed out by michalk, there can be some elements with visitDate=nullwhich 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

Related Questions