2016-04-01 18 views
12

En yeni öğeyi almak için bunu kullanıyorum. Bunu null güvenli ve null tarihler (en eski) ile sıralamak nasıl alabilirim. createDt bir joda LocalDate nesnesidir.Java 8 Stream'de sıralamak için boş güvenli tarih karşılaştırıcısı Stream

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

Lambdalarla tam olarak nasıl çalıştığını bilmiyorum ama bunun için genel bir karşılaştırma yöntemi kullanıyoruz, yani (e1, e2) gibi bir şey olabilir -> compareNullable (e2.getCreateDt() , e1.getCreateDt()) 'davanızda (bir yerde karşılaştırılabilir (T, T) yöntemini belirtmeniz gerekir). – Thomas

cevap

22

boş değerli olabilir Item s ise, kullanım @ rgettman çözümü. boş değerli olabilir LocalDate s ise

, bunu kullanın:

Her iki durumda da
items.stream() 
    .sorted(Comparator.comparing(Item::getCreateDt, Comparator.nullsLast(Comparator.reverseOrder()))); 

, sorted().findFirst() verimsiz olması muhtemeldir olduğuna dikkat çoğu standart uygulamalar ilk tüm akışı sıralamak olarak. Bunun yerine Stream.min kullanmalısınız.

12

Sen açabilirsiniz kendi boş-güvensiz bunu Comparator.nullsLast sarma tarafından bir boş güvenli birine Comparator. (Aynı zamanda Comparator.nullsFirst yoktur.)

boş olmayan daha büyük olması null gördüğü boş dostu karşılaştırıcı döndürür. Her ikisi de null olduğunda, eşit kabul edilir. Her ikisi de boş değilse, siparişi belirlemek için belirtilen Comparator kullanılır.

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

Neden Comparator.comparing' kullanmıyorsunuz? –

+2

@LouisWasserman "Comparator.comparing" işlevini kesinlikle kullanabilmekteyken, acil sorunu çözmeye çalışıyordum. Paul'un cevabı her neyse daha iyiydi, o yüzden onu destekledim. – rgettman