2016-04-01 11 views
12

Ich benutze dies, um das neueste Element zu bekommen. Wie kann ich das Null sicher und sortieren mit null Daten zuletzt (älteste). createDt ist ein joda LocalDate-Objekt.Null sicherer Datumskomparator zum Sortieren in Java 8 Stream

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

Ich weiß nicht genau, wie Sie es mit lambdas machen würden, aber wir verwenden eine generische Vergleichsmethode dafür, dh es könnte etwas wie '(e1, e2) -> compareNullable (e2.getCreateDt() , e1.getCreateDt()) 'in Ihrem Fall (Sie müssten die Methode' compareNullable (T, T) 'irgendwo angeben). – Thomas

Antwort

22

Wenn es die Item s ist, die null sein kann, Lösung die Nutzung @ rgettman.

Wenn es die LocalDate s ist, die null sein kann, verwenden Sie diese:

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

In jedem Fall beachten Sie, dass sorted().findFirst() wahrscheinlich ineffizient sein, da die meisten Standard-Implementierungen zunächst den gesamten Strom sortieren. Sie sollten stattdessen Stream.min verwenden.

12

Sie können schalten Sie Ihre eigene Null unsichere Comparator in eine Null-Safe ein, indem sie es Comparator.nullsLast Verpackung. (Es gibt ein Comparator.nullsFirst auch.)

Gibt einen Null freundlichen Komparator, die null größer sein als Nicht-Null hält. Wenn beide null sind, gelten sie als gleich. Wenn beide nicht null sind, wird die angegebene Comparator zur Bestimmung der Bestellung verwendet.

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

Warum benutzen Sie nicht 'Comparator.comparing'? –

+2

@LouisWasserman Während Sie 'Comparator.comparing' sicherlich verwenden können, habe ich versucht, das unmittelbare Problem zu lösen. Pauls Antwort ist sowieso besser, also habe ich es aufgewertet. – rgettman