在 Java 里,Comparator 处理空值(null)通常有几种常见做法,取决于你是否允许 null、排序规则以及使用场景。下面按实用程度给你总结一下。
Comparator.nullsFirst / nullsLast(Java 8+)这是最标准、最安全的方式。
Comparator<String> comparator =
Comparator.nullsFirst(Comparator.naturalOrder());
List<String> list = Arrays.asList("b", null, "a", null, "c");
list.sort(comparator);
// [null, null, "a", "b", "c"]
Comparator<String> comparator =
Comparator.nullsLast(Comparator.naturalOrder());
List<String> list = Arrays.asList("b", null, "a", null, "c");
list.sort(comparator);
// ["a", "b", "c", null, null]
✅ 优点
如果你自己写 compare(a, b):
Comparator<String> comparator = (a, b) -> {
if (a == null && b == null) return 0;
if (a == null) return 1; // a 是 null,排后面
if (b == null) return -1; // b 是 null,排后面
return a.compareTo(b);
};
if (a == null && b == null) return 0;
if (a == null) return -1;
if (b == null) return 1;
return a.compareTo(b);
⚠️ 缺点
nullsFirst 优雅list.stream()
.filter(Objects::nonNull)
.sorted()
.toList();
Comparator<String> comparator = (a, b) -> {
if (a == null || b == null) {
throw new NullPointerException("不允许 null");
}
return a.compareTo(b);
};
Comparator<Person> comparator =
Comparator.comparing(
Person::getAge,
Comparator.nullsLast(Integer::compareTo)
);
✅ 这是实际项目中最常用的写法
| 场景 | 推荐方式 |
|---|---|
| null 排最前 | Comparator.nullsFirst(...) |
| null 排最后 | Comparator.nullsLast(...) |
| 不允许 null | 提前 filter |
| 对象字段排序 | comparing(..., nullsFirst/Last) |
如果你愿意,可以把具体代码或排序需求贴出来,我可以直接帮你写最合适的 Comparator。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。