使用默认实现的空安全映射比较器

有没有可能在 Java8中创建一个空安全的映射比较器,而不用编写自己的 Comparator实现?

当运行以下代码时,它会导致 NPE,因为 Comparator.comparing()keyExtractor参数可能返回一个 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 中的异常 比较 $77a9974f $1(Compator.java: 469) $Lambda $2/1480010240. compare (Unknown Source) Java.util.compators $NullCompator.ratio (Compators.java: 83) 比较器(TreeMap.java: 376) 在 java.util.TreeMap.getEntry (TreeMap.java: 345) 包含关键字(TreeMap.java: 232) 包含(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)
27088 次浏览

Found a possible solution:

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