Czy istnieje wbudowana możliwość utworzenia komparatora odwzorowującego bezpieczny w środowisku Java 8 bez pisania własnej implementacji Comparator
?mapowanie null-safe Komparator przy użyciu domyślnych implementacji
Podczas pracy następujące kodu, powoduje NPE ponieważ keyExtractor
argument Comparator.comparing()
może zwrócić null
wartość:
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
}
}
wyjątek w wątku "głównym" java.lang.NullPointerException w Java. util.Comparator.lambda $ porównując 77a9974f $ 1 (Comparator.java:469) w java.util.Comparator $$ Lambda $ 2/1480010240.compare (nieznane źródło) w java.util.Comparators $ NullComparator.compare (Comparators. java: 83) w java.util.TreeM ap.getEntryUsingComparator (TreeMap.java:376) w java.util.TreeMap.getEntry (TreeMap.java:345) w java.util.TreeMap.containsKey (TreeMap.java:232) w java.util.TreeSet. zawiera (TreeSet.java:234) na test.ToSort.main (ToSort.java:48)
Korzystanie
Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));
nie działa albo jak tylko ToSort
obiekty, które są null
są prawidłowo bieżnikiem .
wiem, jak napisać własny Comparator
realizację, jestem po prostu szukają bardziej „eleganckie” rozwiązanie jak
Comparator.comparingNullsFirst(ToSort::getSortBy)