Gibt es eine eingebaute Möglichkeit, einen Null-sicheren Mapping-Vergleicher in Java 8 zu erstellen, ohne eine eigene Implementierung von Comparator
zu schreiben?null-sichere Zuordnung Vergleicher mit Standardimplementierungen
Wenn der folgende Code ausgeführt wird, verursacht es eine NPE, weil das Argument von keyExtractor
Comparator.comparing()
null
einen Wert zurückgeben kann:
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
}
}
MitException in thread "main" java.lang.NullPointerException auf Java. util.Comparator.lambda $ comparing $ 77a9974f $ 1 (Comparator.java:469) bei java.util.Comparator $$ Lambda $ 2/1480010240.compare (Unbekannte Quelle) bei java.util.Comparators $ NullComparator.compare (Comparators. Java: 83) bei java.util.TreeM ap.getEntryUsingComparator (TreeMap.java:376) bei java.util.TreeMap.getEntry (TreeMap.java:345) bei java.util.TreeMap.containsKey (TreeMap.java:232) bei java.util.TreeSet. enthält (TreeSet.java:234) bei test.ToSort.main (ToSort.java:48)
Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));
nicht funktioniert entweder als nur ToSort
Objekte, die null
sind treaded richtig .
Ich weiß, wie meine eigene Comparator
Implementierung zu schreiben, auf der Suche I`m nur eine "elegante" Lösung wie
Comparator.comparingNullsFirst(ToSort::getSortBy)