Java中Lambda表达式配合Comparator实现自定义排序,核心是用简洁语法替代匿名内部类:单字段用Comparator.comparing,多字段用thenComparing链式组合,数值比较推荐Integer.compare,字符串用compareTo并注意空值处理。

Java 中 Lambda 表达式配合 Comparator 接口实现自定义对象排序,核心是用简洁语法替代传统匿名内部类,直接定义比较逻辑。
用 Lambda 写 Comparator 实现单字段排序
假设有一个 Person 类,含 name(String)和 age(int)字段。按年龄升序排序可这样写:
Collections.sort(personList, (p1, p2) -> p1.getAge() - p2.getAge());
或用 List.sort()(推荐):
personList.sort((p1, p2) -> p1.getAge() - p2.getAge());
- 注意:用减法适用于基本数值类型且不担心整数溢出;更安全的方式是用
Integer.compare(p1.getAge(), p2.getAge()) - 字符串按字典序升序:
(p1, p2) -> p1.getName().compareTo(p2.getName())
用 Comparator.comparing 配合 Lambda 更清晰
静态方法 Comparator.comparing() 接收一个 Function,返回基于该属性的比较器,语义更明确:
立即学习“Java免费学习笔记(深入)”;
personList.sort(Comparator.comparing(Person::getAge));
也支持逆序、空值处理等链式操作:
- 降序:
Comparator.comparing(Person::getAge).reversed() - 姓名升序,空名排最后:
Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo))
多字段组合排序(复合条件)
用 thenComparing() 链式追加次要排序条件。例如:先按年龄升序,年龄相同时按姓名降序:
personList.sort(Comparator.comparing(Person::getAge)
.thenComparing(Person::getName, Comparator.reverseOrder()));- 支持嵌套调用:
.thenComparing(p -> p.getAddress().getCity())(需确保不为 null) - 空值安全组合:
thenComparing(Comparator.nullsLast(Comparator.naturalOrder()))
在 Stream 中使用 Lambda + Comparator
流式处理时,sorted() 方法直接接收 Comparator:
List<Person> sorted = personList.stream()
.sorted(Comparator.comparing(Person::getAge).thenComparing(Person::getName))
.collect(Collectors.toList());注意:此操作返回新列表,原列表不变。
不复杂但容易忽略:Lambda 让 Comparator 变得极简,关键在于选对构造方式——单字段优先用 comparing,多字段用链式 thenComparing,数值比较慎用减法,字符串和对象优先调用其 compareTo 或指定 nullsFirst/Last 策略。


















