web-dev-qa-db-fra.com

Comparateur de mappage null-safe utilisant des implémentations par défaut

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)
57
flo

Trouvé une solution possible:

Comparator.comparing(ToSort::getSortBy, 
      Comparator.nullsFirst(Comparator.naturalOrder())
)
98
flo