lambda配合comparator多维排序核心是comparing定主序、thencomparing叠次序;支持升/降序混搭、null安全处理及复杂逻辑嵌入,一行代码清晰可控。

直接用 Lambda 配合 Comparator 做多维排序,核心就两点:用 comparing() 定主序,用 thenComparing() 叠加次序,所有逻辑写在一行里,清晰又可控。
基础写法:从单字段到链式组合
单字段升序最简写法:list.sort(Comparator.comparing(Person::getAge));
等价于 (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()),但更安全、可读性更强。
要加第二优先级(比如年龄相同时按姓名升序):list.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
支持无限叠加,第三级、第四级都可用 .thenComparing(...) 追加。
灵活控制每级顺序:升序、降序自由混搭
某一级想降序?在那一级后加 .reversed():
Comparator.comparing(Person::getDept) // 部门升序<br>
.thenComparing(Person::getSalary, Comparator.reverseOrder()) // 薪资降序<br>
.thenComparing(Person::getHireDate); // 入职日期升序
注意:reversed() 是作用于前一个 comparing 或 thenComparing 的结果,不是全局翻转。
安全处理 null 值:避免空指针崩溃
字段可能为 null?别手动判空写三元表达式。
用内置策略更简洁可靠:
-
Comparator.comparing(Person::getNickName, Comparator.nullsLast(String::compareTo))→ null 排最后,非 null 按字典序 -
Comparator.comparing(Person::getScore, Comparator.nullsFirst(Comparator.naturalOrder()))→ null 排最前,非 null 升序
对数值类型也一样适用,例如:Comparator.comparing(Person::getAge, Comparator.nullsLast(Integer::compareTo))
应对复杂逻辑:Lambda 仍可嵌入计算与分支
当排序依据不是简单取值,而是需计算或判断时,Lambda 依然直接可用:
- 按绝对值排序:
list.sort((x, y) -> Integer.compare(Math.abs(x), Math.abs(y))); - 状态优先 + 时间兜底:
list.sort((a, b) -> {<br> int statusCmp = priorityOf(a.getStatus()) - priorityOf(b.getStatus());<br> if (statusCmp != 0) return statusCmp;<br> return b.getUpdateTime().compareTo(a.getUpdateTime()); // 同状态,新更新的靠前<br> });
这种写法适合规则动态、无法提前映射为单一属性的场景,不破坏链式结构,也可和 comparing 混用(例如先用 comparing 处理主字段,再 thenComparing 接一个自定义 Lambda)。
不复杂但容易忽略:多字段排序本质是“逐级比较”,只要每级返回明确的负/零/正整数,整个链式结构就稳定可靠。Lambda 让你把注意力放在业务逻辑上,而不是模板代码里。










