Подтвердить что ты не робот

Null-safe mapping Comparator с использованием реализаций по умолчанию

Есть ли встроенная возможность создания нулевого безопасного сопоставления сопоставления в Java 8 без написания собственной реализации Comparator?

При запуске следующего кода он вызывает NPE, потому что аргумент keyExtractor Comparator.comparing() может возвращать значение 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

    }
}

Исключение в потоке "main" java.lang.NullPointerException     в java.util.Comparator.lambda $сравнение $77a9974f $1 (Comparator.java:469)     на java.util.Comparator $$ Lambda $2/1480010240.compare(Неизвестный источник)     на java.util.Comparators $NullComparator.compare(Comparators.java:83)     в java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376)     в java.util.TreeMap.getEntry(TreeMap.java:345)     в java.util.TreeMap.containsKey(TreeMap.java:232)     в java.util.TreeSet.contains(TreeSet.java:234)     на test.ToSort.main(ToSort.java:48)

Используя

Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));

не работает, поскольку только ToSort объекты, которые null, исправлены правильно.

Я знаю, как написать свою собственную реализацию Comparator, я просто ищу более "элегантное" решение, например

Comparator.comparingNullsFirst(ToSort::getSortBy)
4b9b3361

Ответ 1

Найденное решение:

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