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)
可能な解決策を見つけました:
Comparator.comparing(ToSort::getSortBy,
Comparator.nullsFirst(Comparator.naturalOrder())
)