2016-04-01 18 views
12

私はこれを使用して最新のアイテムを取得しています。どのようにすれば、これをnull安全で、最後にヌル日付(古いもの)とソートすることができます。 createDtはjoda LocalDateオブジェクトです。Java 8ストリームのソート用のNull安全な日付コンパレータ

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

私はラムダを使ってどうやってやるのか正確にはわかりませんが、私はそれに汎用の比較メソッドを使っています。つまり、 '(e1、e2) - > compareNullable(e2.getCreateDt() 、e1.getCreateDt()) 'を実行します(compareNullable(T、T)メソッドをどこかに指定する必要があります)。 – Thomas

答えて

22

それがnullの場合もItemのなら、rgettmanのソリューション@使用しています。

それがnullの場合もLocalDateのなら、これを使用します。いずれの場合も

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

は、ほとんどの標準実装が最初の全体の流れを並べ替えるようsorted().findFirst()は非効率的である可能性が高いことに注意してください。代わりにStream.minを使用してください。

12

あなたはそれをComparator.nullsLastを包むことにより、ヌル・安全なものに独自のヌル・危険なComparatorを変えることができます。 (Comparator.nullsFirstもあります。)

nullがnull以外よりも大きいと考えてヌルフレンドリーコンパレータを返します。両方がnullの場合、それらは等しいとみなされます。両方がnullでない場合、指定されたComparatorが順序を決定するために使用されます。

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

なぜあなたは 'Comparator.comparing'を使用していませんか? –

+2

@LouisWassermanあなたは確かに 'Comparator.comparing'を使うことができますが、私は直ちに問題を解決しようとしていました。とにかくポールの答えは良いので、私はそれを上げた。 – rgettman

関連する問題