web-dev-qa-db-fra.com

Comparateur de date Null safe pour le tri dans Java 8 Stream

J'utilise ceci pour obtenir le dernier article. Comment puis-je obtenir que ce soit null safe et trier avec les dates null last createDt est un objet joda LocalDate.

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

Si c'est le Items qui peut être nul, utilisez la solution de @ rgettman. 

Si c'est le LocalDates qui peut être null, utilisez ceci:

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

Dans les deux cas, notez que sorted().findFirst() sera probablement inefficace, car la plupart des implémentations standard trient tout d'abord le flux complet. Vous devriez utiliser Stream.min à la place.

42
Paul Boddington

Vous pouvez transformer votre propre variable Comparator null-unsafe en une machine null-safe en l'enveloppant Comparator.nullsLast . (Il existe également un Comparator.nullsFirst.)

Renvoie un comparateur null-friendly qui considère que null est supérieur à non-null. Lorsque les deux sont null, ils sont considérés comme égaux. Si les deux sont non nuls, la Comparator spécifiée est utilisée pour déterminer l'ordre.

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

écrivez votre coutume:

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

Ceci est le premier tri des nulls, change la valeur de retour de l'instruction if

0
Mohsen Kashi