Java Lambda 表达式极大简化 Comparator 排序:一行替代匿名类,支持方法引用、多级链式排序、逆序、空值安全及组合式自定义逻辑,并兼容 Stream 流式排序。

Java Lambda 表达式让 Comparator 排序变得极简——不用写冗长的匿名内部类,一行就能定义排序逻辑。
用 Lambda 替代匿名 Comparator 类
传统方式要写 5–6 行代码:
list.sort(new Comparator<Person>() {
public int compare(Person a, Person b) {
return a.getAge() - b.getAge();
}
});用 Lambda 只需一行:
list.sort((a, b) -> a.getAge() - b.getAge());
更进一步,还能直接用方法引用(如果逻辑足够简单):
立即学习“Java免费学习笔记(深入)”;
list.sort(Comparator.comparingInt(Person::getAge));
多级排序一气呵成
以前嵌套 thenComparing 还得配匿名类,现在链式 + Lambda 非常清晰:
- 先按年龄升序,年龄相同时按姓名字典序
- list.sort(Comparator.comparingInt(Person::getAge).thenComparing(Person::getName));
- 支持逆序:加
.reversed(),比如姓名倒序:thenComparing(Person::getName).reversed() - 空值安全处理:用
thenComparing(Comparator.nullsLast(Comparator.naturalOrder()))
自定义比较逻辑也轻量
复杂规则不再需要单独写类或重复 if-else:
- 按“是否为 VIP”优先排,再按积分降序: (a, b) -> { int vipCmp = Boolean.compare(b.isVip(), a.isVip()); return vipCmp != 0 ? vipCmp : Integer.compare(b.getPoints(), a.getPoints()); }
- 但推荐拆解为组合式写法,更可读:Comparator.comparing((Person p) -> !p.isVip()).thenComparingInt(Person::getPoints).reversed()
Stream 中排序同样简洁
配合流式操作,排序只是链中一个环节,语义干净:
list.stream()
.sorted(Comparator.comparing(Person::getDepartment)
.thenComparingInt(Person::getSalary).reversed())
.limit(10)
.collect(Collectors.toList());注意:sorted() 返回新流,不修改原集合;如需就地排序仍用 List.sort()。


















