当前位置: 首页 > 面试题库 >

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

梁丘缪文
2023-03-14
问题内容

是否有内置的可能性在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

    }
}

java.util.Comparator.lambda $ comparing $ 77a9974f $
1(Comparator.java:469)处的线程“
main”中的java.lang.NullPointerException,java.util.Comparator $$ Lambda $ 2 /
1480010240.compare(未知源)处java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376)的java.util.Comparators
$
NullComparator.compare(Comparators.java:83)在java.util的java.util.TreeMap.getEntry(TreeMap.java:345)
.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));

也不起作用,因为只有正确踩踏的ToSorthtml" target="_blank">对象null

我知道如何编写自己的Comparator实现,我只是在寻找更“优雅”的解决方案,例如

Comparator.comparingNullsFirst(ToSort::getSortBy)

问题答案:

找到了可能的解决方案:

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


 类似资料:
  • 问题内容: 在Python 2.7中,我定义了一个空的新类: 然后创建新类的实例列表: 然后尝试对列表进行排序: 令人惊讶的是,即使我还没有定义一种比较以下实例的方法,该类也不会抱怨: 那里到底发生了 什么?这种行为的理由是什么(可能令人惊讶)? 问题答案: 我认为唯一的理由是可以方便地对对象进行排序,例如将其用作具有某些默认行为的字典键。语言定义中的相关章节位于:https : //docs.p

  • 我在一个项目中使用Spring Boot和Data REST,我想禁用以下默认映射来调试映射问题: 我发现这个问题禁用了,这会导致这些映射不被映射。但是,我的控制器映射也不会被映射。 我可以在保留我定义的映射时禁用这些映射吗? 提前谢谢。

  • 我使用此链接中的以下代码为我的一个数据模型类(JSON到JAXB模型的转换)添加自定义反序列化程序。 我想使用com。fasterxml。杰克逊。jaxrs。json。JacksonJaxbJsonProvider,用于其他数据模型的JSON序列化/反序列化。 JacksonJaxbJsonProvider的默认实现非常适合我的JAXB模型,将超类作为抽象类。但是,一旦我提供了自己的自定义Obje

  • 问题内容: 我试图识别具有默认值NULL或未设置默认值的数据库列。为此,我正在执行查询。 在此查询的输出中,我正在获取未设置默认值(空)的列,但是我没有在获取默认值是NULL的列 问题答案: 在oracle中(至少11g),如果您不为列提供默认值,就好比给它。 看这个例子 更新 感谢@pratik garg的评论,现在我了解到您所要求的是一种查询列的方法。 由于如@PratikGrag所述,当您定

  • 我们的应用程序将大量数据存储在内存中,存储在多种不同类型的地图中,以便快速查找。为了保持简单(不考虑原始贴图),它始终是一个带有一个或多个键的贴图。性能对我们来说是一个很大的要求。 我想找到性能最好的地图实现,正如这里建议的那样,我比较了这些实现: > java中的包装键(元组作为键)。util。哈希图 元组作为网络中的键。openhft。科洛博克。收集地图搞砸HashObjObjMap,根据这一

  • 我正在尝试将ArrayList转换为Treemap,所以我编写了一个比较各种方法的基准: 1)并行流中的toMap 2)toMap在流中 3)流中forEach 主 大小为10_000的输出如下 “for loop”与预期一样是最慢的 回到正题,为什么当arraylist列表很大时,for each in parallel steam会失败? 运行i7 2670QM,因此线程池大小应为8