java中lambda表达式通过comparator接口实现简洁可读的自定义排序,支持升序、降序、多字段链式排序、null安全处理及复杂条件分支逻辑,并适用于集合、数组和stream排序。

Java 中 Lambda 表达式实现自定义排序逻辑,核心是配合 Comparator 接口使用,替代传统匿名内部类,让排序代码更简洁、可读性更强。
用 Lambda 写 Comparator 实现升序/降序
集合排序(如 list.sort())或数组排序(Arrays.sort())都接受一个 Comparator。Lambda 可直接作为参数传入:
- 升序:`(a, b) -> a.compareTo(b)` 或 `(a, b) -> Integer.compare(a, b)`(对基本类型包装类)
- 降序:`(a, b) -> b.compareTo(a)` 或 `Comparator.reverseOrder()`(更推荐)
- 字符串按长度排序:`(s1, s2) -> Integer.compare(s1.length(), s2.length())`
多字段组合排序(链式调用)
利用 Comparator.comparing() 和后续的 .thenComparing() 方法,避免嵌套三元判断:
- 先按年龄升序,年龄相同时按姓名字典序:`Comparator.comparing(Person::getAge).thenComparing(Person::getName)`
- 其中某个字段降序:`.thenComparing(Person::getScore, Comparator.reverseOrder())`
- 支持 null 安全:`comparing(Person::getName, Comparator.nullsLast(String::compareTo))`
处理复杂比较逻辑(带条件分支)
当排序规则涉及 if-else 判断时,Lambda 内部可写完整代码块:
- 例如:优先排状态为 "ACTIVE" 的对象,再按创建时间倒序:
(p1, p2) -> {<br> int statusCompare = Boolean.compare(p2.getStatus().equals("ACTIVE"), p1.getStatus().equals("ACTIVE")); // 注意顺序实现 ACTIVE 在前<br> if (statusCompare != 0) return statusCompare;<br> return Long.compare(p2.getCreatedAt(), p1.getCreatedAt()); // 倒序<br> } - 注意:返回值必须是 int,且负数表示 p1 应在 p2 前,正数反之
在 Stream 中使用 Lambda 排序
流式操作中通过 sorted() 中间操作应用 Lambda 排序器:
- `list.stream().sorted(Comparator.comparing(User::getLevel).reversed()).collect(Collectors.toList())`
- 也可直接传 Lambda:`.sorted((u1, u2) -> u1.getName().compareTo(u2.getName()))`
- 注意:`sorted()` 返回新流,不修改原集合
不复杂但容易忽略:Lambda 写排序时,参数类型由上下文自动推断,无需显式声明;但务必保证比较逻辑满足传递性、对称性和一致性,否则排序结果不可预期。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











