Lambda表达式简化Comparator编写,直接内联“怎么比”的逻辑,支持升序、降序、多字段链式排序、空值处理及复杂条件判断,可直接用于集合sort()或Stream sorted()。

用 Lambda 表达式写 Comparator,核心是把“怎么比”这个逻辑直接写成一行函数,既简洁又易读,还能随时切换规则。
用 Lambda 写 Comparator 的基本写法
Comparator 是个函数式接口,只有一个抽象方法 compare(T o1, T o2),所以能用 Lambda 简化。不需要再写匿名内部类或单独的比较器类。
- 升序:(a, b) -> a.compareTo(b) 或 (a, b) -> Integer.compare(a, b)
- 降序:(a, b) -> b.compareTo(a)
- 按字符串长度:(s1, s2) -> Integer.compare(s1.length(), s2.length())
多字段组合排序(链式调用)
利用 Comparator.comparing() 和 thenComparing(),配合 Lambda,可清晰表达优先级。
- 先按年龄升序,年龄相同时按姓名字典序:
Comparatorcmp = Comparator.comparing(p -> p.getAge()).thenComparing(p -> p.getName()); - 某字段降序?加 reversed():
Comparator.comparing((Person p) -> p.getScore()).reversed() - 避免空指针?用 comparing(..., Comparator.nullsLast())
处理复杂或动态排序逻辑
当比较逻辑涉及计算、条件判断或外部参数时,Lambda 依然适用,只需把逻辑封装进括号里。
- 按绝对值排序:(x, y) -> Integer.compare(Math.abs(x), Math.abs(y))
- 按状态+时间混合规则(如“进行中”排最前,“已完成”次之,同状态按更新时间倒序):
(a, b) -> {
int stateCmp = statusOrder(a.getStatus()).compareTo(statusOrder(b.getStatus()));
if (stateCmp != 0) return stateCmp;
return b.getUpdateTime().compareTo(a.getUpdateTime());
}
在集合排序中直接使用
不再需要额外定义比较器变量,一行搞定。
- 对 List 排序:
list.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName)); - Stream 排序:
list.stream().sorted(comparing(p -> p.getSalary()).reversed()).collect(Collectors.toList()); - 注意:sort() 是就地修改;sorted() 返回新流,原集合不变

















