在 Java 中,Comparator 本身是一个函数式接口,通常我们说的“判空”可能有几种不同场景。下面按常见情况逐一说明。
Comparator 对象本身是否为 null最常见的情况:你拿到了一个 Comparator<T> 变量,使用前先判断它是否为 null。
Comparator<String> comparator = null;
if (comparator != null) {
list.sort(comparator);
} else {
// 使用默认排序或自然排序
list.sort(Comparator.naturalOrder());
}
✅ 这是最基础、也是必须的判空方式
Comparator 中处理【被比较对象为 null】的情况如果你在排序时,集合里可能包含 null 元素,就需要在 Comparator 里处理 null。
Comparator.nullsFirst(推荐)List<String> list = Arrays.asList("b", null, "a");
list.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
// null 会排在最前面
Comparator.nullsLastlist.sort(Comparator.nullsLast(Comparator.naturalOrder()));
// null 会排在最后面
Comparator 中手动判空如果你自己写 Comparator:
Comparator<String> cmp = (a, b) -> {
if (a == null && b == null) return 0;
if (a == null) return -1;
if (b == null) return 1;
return a.compareTo(b);
};
⚠️ 不推荐手写,优先用 nullsFirst / nullsLast
list.sort(
Comparator
.nullsLast(
Comparator.comparing(
MyObj::getName,
Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER)
)
)
);
❌ 这样会 NPE:
list.sort((a, b) -> a.compareTo(b)); // a 或 b 为 null 直接炸
✅ 正确方式:
list.sort(Comparator.nullsLast(String::compareTo));
| 场景 | 解决方式 |
|---|---|
| Comparator 变量为 null | if (comparator != null) |
| 被比较对象为 null | Comparator.nullsFirst / nullsLast |
| 自定义比较 | 手动判空(不推荐) |
| 推荐做法 | 使用 Java 标准 API |
如果你有具体代码场景(比如 List 排序、Map 排序、Stream 排序),可以贴出来,我可以帮你精确改。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。