直接用Comparator.comparing(Person::getAge)即可实现按age升序排序,支持降序、多字段链式排序、null安全及自定义比较逻辑,简洁高效且类型安全。

直接用 Comparator.comparing(Person::getAge) 就行,一行搞定按 age 升序排序。
基础写法:方法引用最简形式
只要属性的 getter 方法返回可比较类型(如 Integer、String、LocalDateTime 等),就能直接用方法引用:
-
list.sort(Comparator.comparing(Person::getAge))—— 按 int 包装类升序 -
list.sort(Comparator.comparing(Person::getName))—— 按 String 字典序升序 -
list.sort(Comparator.comparing(Person::getBirthDate))—— 按 LocalDateTime 时间先后升序
注意:不需要写 u -> u.getAge() 这种 lambda,方法引用 Person::getAge 更简洁、更安全、IDE 支持更好。
降序与反向控制
升序是默认行为,要降序,别手写 (a, b) -> b.getAge().compareTo(a.getAge()),推荐组合已有工具:
立即学习“Java免费学习笔记(深入)”;
-
Comparator.comparing(Person::getAge).reversed()—— 整体倒序 -
Comparator.comparing(Person::getAge, Comparator.reverseOrder())—— 仅该字段降序(多级排序时常用) -
list.sort(Comparator.comparingInt(Person::getHeight).reversed())—— 基本类型用comparingInt更高效(避免自动装箱)
多字段链式排序
用 .thenComparing() 逐级追加,逻辑清晰、无嵌套、易读易改:
- 先按年龄升序,年龄相同时按姓名降序:
Comparator.comparing(Person::getAge).thenComparing(Person::getName, Comparator.reverseOrder()) - 支持 null 安全:
Comparator.comparing(Person::getNickName, Comparator.nullsLast(String::compareTo)) - 混合类型也自然:
Comparator.comparing(Person::getScore).thenComparingInt(Person::getLevel)
自定义比较逻辑的轻量接入
当属性本身不可比(比如自定义枚举、时间差、复合状态),把比较逻辑封装成静态方法,再用方法引用接入:
- 静态工具方法:
public static int compareByYear(LocalDate d1, LocalDate d2) { return Integer.compare(d1.getYear(), d2.getYear()); }
调用:Comparator.comparing(Person::getBirthDate, MyUtils::compareByYear) - 若需实例方法参与,确保签名匹配:
Comparator.comparing(p -> p.getScore(), Score::compareTo)(注意这里不能直接写Person::getScore,因为getScore()返回的是Score实例,而Score::compareTo是实例方法,需由具体对象调用)


















