2015-02-13 3 views
31

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) 

risposta

55

trovato una possibile soluzione:

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