nullsicherer Mapping-Komparator, der Standardimplementierungen verwendet

Lesezeit: 2 Minuten

Gibt es eine eingebaute Möglichkeit, einen nullsicheren Zuordnungskomparator in Java 8 zu erstellen, ohne eine eigene Implementierung von zu schreiben Comparator?

Beim Ausführen des folgenden Codes wird ein NPE verursacht, da die keyExtractor Argument von Comparator.comparing() kann a zurückgeben null Wert:

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

    }
}

Ausnahme im Thread „main“ java.lang.NullPointerException bei java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469) bei java.util.Comparator$$Lambda$2/1480010240.compare(Unknown Source) at java.util.Comparators$NullComparator.compare(Comparators.java:83) bei java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376) bei java.util.TreeMap.getEntry(TreeMap.java:345) bei java.util .TreeMap.containsKey(TreeMap.java:232) bei java.util.TreeSet.contains(TreeSet.java:234) bei test.ToSort.main(ToSort.java:48)

Verwenden

Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));

funktioniert auch nicht als einzige ToSort Objekte, die sind null werden richtig getreten.

Ich weiß, wie ich meine eigenen schreiben kann Comparator Implementierung, ich suche nur eine “elegantere” Lösung wie

Comparator.comparingNullsFirst(ToSort::getSortBy)

Habe eine mögliche Lösung gefunden:

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

  • Der Grund, warum diese Lösung funktioniert, liegt in der Reihenfolge der Verschachtelung von Komparatoren. In Ihrer Frage war der innerste Komparator (und damit der erste, der ausgeführt wurde). ToSort::getSortBy und die nullsFirst wurde darum gewickelt. In dieser Antwort die nullsFirst comparator wird jetzt zuerst ausgeführt und bietet Sicherheit vor der Nullrückgabe getSortBy Anrufe

    – Geert

    29. September 2020 um 14:48 Uhr

1016890cookie-checknullsicherer Mapping-Komparator, der Standardimplementierungen verwendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy