Comparator.comparing是Java 8提供的便捷方法,用于根据对象属性创建类型安全的比较器,支持升序、降序、null处理及多级排序。

Comparator.comparing 是 Java 8 引入的便捷方法,用于根据对象的某个属性快速创建比较器,常配合 sort()、stream().sorted() 等使用,写法简洁且类型安全。
按单个属性升序排序
最常用场景:按字段值自然顺序排序(要求该字段类型实现 Comparable,如 String、Integer、LocalDateTime 等)。
- 语法:
Comparator.comparing(对象::getter方法) - 例如对
List<Person>按姓名排序:list.sort(Comparator.comparing(Person::getName)) - 也可用于流:
list.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList())
指定排序方向(升序/降序)
默认是升序;用 reversed() 可转为降序。
- 降序写法:
Comparator.comparing(Person::getAge).reversed() - 更清晰的写法(推荐):
Comparator.comparing(Person::getAge, Comparator.reverseOrder()) - 注意:
reversed()作用于整个比较器,不是只翻转某一步
处理 null 值(避免 NullPointerException)
如果 getter 可能返回 null(如 String 字段未初始化),直接用 comparing 会抛异常。需用 comparing 的重载版本指定 null 处理策略:
立即学习“Java免费学习笔记(深入)”;
-
Comparator.comparing(Person::getName, Comparator.nullsFirst(String::compareTo))—— null 排最前 -
Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo))—— null 排最后 - 若属性本身是基本类型包装类(如
Integer),也可用Comparator.nullsLast(Comparator.naturalOrder())
多级排序(先按 A,再按 B)
用 thenComparing 链式追加次要排序条件:
Comparator.comparing(Person::getAge).thenComparing(Person::getName)- 支持链式多次调用:
comparing(...).thenComparing(...).thenComparing(...) - 每级都可独立指定 null 策略或逆序,例如:
comparing(Person::getAge).thenComparing(Person::getName, Comparator.nullsLast(String::compareTo))


















