Comparator.nullsFirst 和 nullsLast 是 Java 8 提供的静态方法,用于安全处理 null 值排序:前者使 null 排最前且彼此相等,后者使 null 排最后且彼此相等;二者均绕过原始比较器的 null 处理逻辑,支持链式组合但需为各字段单独指定策略。

Comparator.nullsFirst 和 Comparator.nullsLast 是 Java 8 引入的静态工厂方法,专门用于在比较时**统一、安全地处理 null 值**,避免 NullPointerException,并明确 null 在排序结果中的位置。
nullsFirst:null 值排在最前面
它包装一个非 null 安全的比较器(比如 Comparator.naturalOrder() 或自定义比较器),让所有 null 元素在排序时**优先于任何非 null 元素**,且 null 之间视为相等。
例如对字符串列表排序:
Listlist.sort(Comparator.nullsFirst(String::compareTo));
// 结果:[null, null, "apple", "banana", "cherry"]
nullsLast:null 值排在最后面
与 nullsFirst 相反,它确保所有 null 元素排在**所有非 null 元素之后**,null 之间仍视为相等。
同样例子:
// 结果:["apple", "banana", "cherry", null, null]
底层逻辑:不依赖被比较对象的 compareTo 方法
这两个方法内部做了 null 判定,完全绕过原始比较器对 null 的处理逻辑。也就是说:
- 即使你传入的比较器本身不支持 null(如
String::compareTo),包装后也能安全运行 - null 和非 null 比较时,不调用原始比较器;只有两个非 null 值才交给原始比较器处理
- null 与 null 比较始终返回 0(即相等),不会触发原始比较器
链式组合:可嵌套使用,但要注意顺序
它们可以和其他比较器组合,比如按年龄升序,null 年龄排最后,年龄相同时再按姓名升序(null 姓名排最前):
Comparator.thenComparing(Person::getName, Comparator.nullsFirst(String::compareTo));
注意:每个字段的 null 策略需单独指定,不能跨字段继承。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











