Esiste una possibilità di creare un comparatore di mappatura Null-Secure in Java 8 senza scrivere una propria implementazione di Comparator
?Comparatore mappatura null-safe utilizzando le implementazioni predefinite
Quando si esegue il seguente codice, provoca un NPE perché l'argomento keyExtractor
di Comparator.comparing()
può restituire un valore 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 in thread "main" java.lang.NullPointerException a Java. util.Comparator.lambda $ confronto $ 77a9974f $ 1 (Comparator.java:469) a java.util.Comparator $$ Lambda $ 2/1480010240.compare (fonte sconosciuta) a java.util.Comparators $ NullComparator.compare (Comparatori. java: 83) all'indirizzo java.util.TreeM ap.getEntryUsingComparator (TreeMap.java:376) a java.util.TreeMap.getEntry (TreeMap.java:345) a java.util.TreeMap.containsKey (TreeMap.java:232) a java.util.TreeSet. contiene (TreeSet.java:234) a test.ToSort.main (ToSort.java:48)
Uso
Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));
non funziona sia come solo ToSort
oggetti che sono null
siano correttamente treaded .
so come scrivere il mio Comparator
implementazione, `m solo cercando una soluzione più "elegante", come
Comparator.comparingNullsFirst(ToSort::getSortBy)