2015-02-13 6 views
31

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 keyExtractorComparator.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 

    } 
} 

Exception 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)

Mit
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) 

Antwort

55

Gefunden eine mögliche Lösung:

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