java lambda配合comparator的最简写法是优先用方法引用(如comparing(person::getage)),多级排序用thencomparing链式拼接,自定义逻辑保持单表达式lambda,复杂逻辑提取为静态方法复用。

Java Lambda 表达式配合 Comparator,最简写法就是直接用方法引用或一行三元逻辑,避开冗长的 if-else 和显式 return。
用方法引用替代手动比较
当比较字段是基本类型(如 int、long、String)且支持自然序时,优先用 Comparator.comparing() + 方法引用:
-
list.sort(comparing(Person::getAge));—— 按年龄升序 -
list.sort(comparing(Person::getName, String.CASE_INSENSITIVE_ORDER));—— 忽略大小写比姓名 -
list.sort(comparing(Person::getAge).reversed());—— 降序,链式调用更清晰
多级排序用 thenComparing 链式拼接
不用嵌套三目或 if,直接链式组合,语义明确、无分支逻辑:
comparing(Person::getAge).thenComparing(Person::getName)comparing(Person::getAge).thenComparing(p -> p.getScore(), reverseOrder())- 支持 null 安全:
comparing(Person::getDepartment, nullsLast(String::compareTo))
自定义逻辑用一行 Lambda(不写 return / 大括号)
仅当需要非自然比较逻辑时,才手写 Lambda。保持单表达式,避免大括号和 return:
- 按绝对值差排序:
(a, b) -> Integer.compare(Math.abs(a.getValue()), Math.abs(b.getValue())) - 布尔字段优先 true:
(a, b) -> Boolean.compare(b.isActive(), a.isActive())(注意顺序翻转) - 空值排最后 + 字符串长度优先:
(a, b) -> { int c = Integer.compare(Objects.toString(a, "").length(), Objects.toString(b, "").length()); return c != 0 ? c : Comparator.nullsLast(String::compareTo).compare(a, b); }—— 这种稍复杂就建议拆成静态方法,不强求一行
用静态工具方法封装复用逻辑
重复的比较逻辑不要硬塞 Lambda,提取为静态方法,调用时仍极简:
-
// 工具类中
public static int compareByPriority(Task a, Task b) {<br> return Integer.compare(b.getPriority() - a.getPriority(), 0); // 高优在前<br>} -
// 使用处
list.sort((a, b) -> compareByPriority(a, b));或更简洁:list.sort(MyComparators::compareByPriority)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











