2015-02-13 11 views
31

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) 

Odpowiedz

55

Znaleziono Możliwe rozwiązanie:

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