Java Stream: сортировка по полю ZoneDateTime - PullRequest
0 голосов
/ 18 мая 2019

Я хочу отсортировать список в обратном порядке по полю 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)     

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

Кажется, что visitDate в некоторых ваших объектах dto был нулевым. Одно из решений - отфильтровать нулевые элементы:

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());
2 голосов
/ 18 мая 2019

Как правильно указал michalk, могут быть некоторые элементы с visitDate=null, которые могут вызвать NullPointerException Поэтому вы можете фильтровать ненулевые значения,

 visitViewDTOList.stream().filter(ele-> Objects.nonNull(ele.getVisitDate()))
                .sorted(Comparator.comparing(VisitViewDTO::getVisitDate).reversed())
                .limit(20).collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...