Existe-t-il une possibilité intégrée de créer un comparateur de mappage sans danger dans Java 8 sans écrire une implémentation propre de Comparator
?
Lors de l'exécution du code suivant, il provoque un NPE car l'argument keyExtractor
de Comparator.comparing()
peut renvoyer une valeur null
:
public class ToSort
{
private String sortBy;
public ToSort(String sortBy)
{
this.sortBy = sortBy;
}
public String getSortBy()
{
return sortBy;
}
public static void main(String[] args)
{
// mapping comparator
Comparator<ToSort> comp = Comparator.comparing(ToSort::getSortBy);
SortedSet<ToSort> set = new TreeSet<>(comp);
ToSort o1 = new ToSort("1");
ToSort o2 = new ToSort(null);
set.add(o1);
System.out.println(set.contains(o2)); //NPE because o2.getSortBy() == null
}
}
Exception dans le thread "principal" Java.lang.NullPointerException à Java.util.Comparator.lambda $ comparant 77a9974f $ 1 (Comparator.Java:469) à Java.util.Comparator $$ Lambda 2 $/1480010240.compare (source inconnue) à Java.util.Comparators $ NullComparator.compare (Comparators.Java:83) sur Java.util.TreeMap.getEntryUsingComparator (TreeMap.Java:376) sur Java.util.TreeMap.getEntry (TreeMap.Java:345) sur Java.util .TreeMap.containsKey (TreeMap.Java:232) sur Java.util.TreeSet.contains (TreeSet.Java:234) sur test.ToSort.main (ToSort.Java:48)
En utilisant
Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));
ne fonctionne pas non plus car seuls les objets ToSort
qui sont null
sont correctement foulés.
Je sais comment écrire ma propre implémentation Comparator
, je cherche juste une solution plus "élégante" comme
Comparator.comparingNullsFirst(ToSort::getSortBy)
Trouvé une solution possible:
Comparator.comparing(ToSort::getSortBy,
Comparator.nullsFirst(Comparator.naturalOrder())
)