在 Java 中使用 Comparator 时,空值(null)处理是一个非常常见的问题。默认情况下,如果比较的对象中有 null,直接调用 compareTo 或访问属性会抛出 NullPointerException。
下面按常见场景给你总结和示例。
Comparator.nullsFirst / nullsLast(推荐 ✅)Java 8 开始,Comparator 提供了专门处理 null 的方法。
List<String> list = Arrays.asList("b", null, "a", null, "c");
list.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
// null 排在最前面
list.sort(Comparator.nullsLast(Comparator.naturalOrder()));
// null 排在最后面
假设有实体类:
class User {
private String name;
public String getName() { return name; }
}
按 name 排序,并处理 null:
List<User> users = ...;
users.sort(
Comparator.comparing(
User::getName,
Comparator.nullsLast(Comparator.naturalOrder())
)
);
✅ 含义:
User::getName:提取比较字段nullsLast:name 为 null 的用户排在最后users.sort(
Comparator
.comparing(User::getName, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(User::getAge, Comparator.nullsLast(Comparator.naturalOrder()))
);
Comparator<User> cmp = (a, b) -> {
if (a.getName() == null && b.getName() == null) return 0;
if (a.getName() == null) return 1;
if (b.getName() == null) return -1;
return a.getName().compareTo(b.getName());
};
⚠️ 可读性差,容易出错
users.sort(
Comparator.comparing(
u -> u.getName() == null ? "" : u.getName()
)
);
⚠️ 仅适合逻辑允许替换默认值的场景
❌ 这样会 NPE:
users.sort(Comparator.comparing(User::getName));
✅ 一定要加 null 处理
| 场景 | 推荐方式 |
|---|---|
| 单个字段 | nullsFirst / nullsLast |
| 多字段 | 链式 thenComparing |
| 排序稳定性 | 明确 null 放前还是后 |
| 可读性 | 用 Comparator 静态方法 |
如果你有 具体排序场景(如 Map、自定义对象、流式排序),我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。