web-dev-qa-db-ja.com

デフォルト実装を使用したヌルセーフマッピングコンパレータ

Comparatorの独自の実装を作成せずに、Java 8でnullセーフマッピングコンパレーターを作成する組み込みの可能性はありますか?

次のコードを実行すると、Comparator.comparing()keyExtractor引数がnull値を返す可能性があるため、NPEが発生します。

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

    }
}

Java.util.Comparator.lambda $ comparing $ 77a9974f $ 1(Comparator.Java:469)at Java.util.Comparator $$ Lambda $ 2/1480010240.compare(Unknown Source)のスレッド「メイン」Java.lang.NullPointerExceptionの例外Java.util.TreeMap.getEntry(TreeMap.Java:345)のJava.util.TreeMap.getEntryUsingComparator(TreeMap.Java:376)のJava.util.TreeMap.getEntry(TreeMap.Java:345)のJava.util.Comparators $ NullComparator.compare(Comparators.Java:83) .TreeMap.containsKey(TreeMap.Java:232)at Java.util.TreeSet.contains(TreeSet.Java:234)at test.ToSort.main(ToSort.Java:48)

を使用して

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

ToSortであるnullオブジェクトのみが適切に処理されるため、機能しません。

私は自分のComparator実装を書く方法を知っています。次のようなより「エレガントな」ソリューションを探しています。

Comparator.comparingNullsFirst(ToSort::getSortBy)
57
flo

可能な解決策を見つけました:

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