it-swarm.com.ru

Нулевой безопасный компаратор даты для сортировки в Java 8 Stream

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

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

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

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

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

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

42
Paul Boddington

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

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

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

напишите свой заказ:

stream().sorted((o1, o2) ->
                        (o1.getF1() == null || o2.getF1() == null) ? 1 :
                                o1.getF1().compareTo(o2.getF1())
                )

Это сортировка нулями в первую очередь, измените возвращаемое значение оператора if с 1 на -1 для нуля последними

0
Mohsen Kashi