如何在 java 中使用 Comparator.comparing 在链接对象键进行比较之前检查 null

How to check for null before comparing by linked object key using Comparator.comparing in java

提问人:Shiv 提问时间:8/24/2023 更新时间:8/25/2023 访问量:41

问:

Comparator.comparing(ProjectVo::getCategory, Comparator.comparing(ProjectCategoryVo::getName))

但是,category 可以为 null,因此在排序时会抛出异常

如何为类别应用空比较器?

JAVA-8 比较器

评论


答:

0赞 iamgirdhar 8/25/2023 #1

可以使用 nullsFirstnullsLast 方法,以便在比较期间处理 null 值。java.util.Comparator

1.使用 nullsFirst 方法

Comparator.comparing(ProjectVo::getCategory, 
                     Comparator.comparing(ProjectCategoryVo::getName),
                     Comparator.nullsFirst(Comparator.naturalOrder()));

2.使用 nullsLast 方法

Comparator.comparing(ProjectVo::getCategory, 
                     Comparator.comparing(ProjectCategoryVo::getName),
                     Comparator.nullsLast(Comparator.naturalOrder()));

您可以根据自己的类型使用 or 和 和 方法 排序。Comparator.naturalOrder()Comparator.reverseOrder()nullsFirstnullsLast

0赞 scrhartley 8/25/2023 #2

您无需使用 naturalOrder 来防止 getCategory 返回 null:

Comparator.comparing(ProjectVo::getCategory,
    Comparator.nullsFirst(Comparator.comparing(ProjectCategoryVo::getName)));

如果我担心getName返回null,我会使用这个技巧:

Comparator.comparing(ProjectVo::getCategory,
    Comparator.comparing(ProjectCategoryVo::getName,
        Comparator.nullsFirst(Comparator.naturalOrder())));

如果我担心 ProjectVo 为 null:

Comparator.nullsFirst(Comparator.comparing(ProjectVo::getCategory,
        Comparator.comparing(ProjectCategoryVo::getName)));

评论

0赞 Shiv 8/25/2023
感谢您的回复。我使用 Comparator.comparing((ProjectVo pvo) -> { return pvo.getCategory() == null 实现了它?“” : pvo.getCategory().getName();你觉得这有什么问题吗?
2赞 Holger 8/25/2023
@Shiv这将考虑空字符串并相等,并为它们产生不可预测的顺序。另一个问题是没有理由进行这种手动处理。null