2016-04-01 2 views
12

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

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

Я не знаю точно, как вы это сделаете с lambdas, но мы используем общий метод сравнения для этого, то есть это может быть что-то вроде '(e1, e2) -> compareNullable (e2.getCreateDt() , e1.getCreateDt()) 'в вашем случае (вы должны были бы предоставить метод compareNullable (T, T) где-нибудь). – Thomas

ответ

22

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

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

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

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

12

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

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

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

Почему вы не используете 'Comparator.comparing'? –

+2

@LouisWasserman Хотя вы, безусловно, можете использовать 'Comparator.comparing', я искал, чтобы решить ближайшую проблему. В любом случае, ответ Павла лучше, поэтому я его поддержал. – rgettman

Смежные вопросы