最佳答案
有没有可能在 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)