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)