Null надежный компаратор даты для сортировки в Java 8 Stream

Я использую это, чтобы получить новый элемент. Как я могу заставить это быть нулевым и сортировать с нулевыми датами последней (самой старой). createDt является объектом joda LocalDate.

Optional<Item> latestItem = items.stream()
                             .sorted((e1, e2) -> e2.getCreateDt().compareTo(e1.getCreateDt()))
                             .findFirst();

Ответ 1

Если это значение Item, которое может быть нулевым, используйте решение @rgettman.

Если это LocalDate, который может быть нулевым, используйте это:

items.stream()
     .sorted(Comparator.comparing(Item::getCreateDt, Comparator.nullsLast(Comparator.reverseOrder())));

В любом случае обратите внимание, что sorted().findFirst(), вероятно, будет неэффективным, так как большинство стандартных реализаций сначала сортируют весь поток. Вместо этого вы должны использовать Stream.min.

Ответ 2

Вы можете превратить свой собственный null-unsafe Comparator в нуль-безопасный, обернув его Comparator.nullsLast. (Существует также Comparator.nullsFirst.)

Возвращает нуль-дружественный компаратор, который считает, что null больше, чем не-null. Когда оба значения null, они считаются равными. Если оба значения не равны нулю, для определения порядка используется указанный Comparator.

.sorted(Comparator.nullsLast(
     (e1, e2) -> e2.getCreateDt().compareTo(e1.getCreateDt())))
.findFirst();