Java中Lambda配合Comparator排序本质是用简洁函数式写法替代匿名内部类,支持List、数组、Stream等多种场景,结合comparing链式调用可实现多字段、null安全、升降序等灵活排序。

Java 中用 Lambda 表达式配合 Comparator 排序,本质是把“怎么比”这个逻辑直接写成一行函数,替代冗长的匿名内部类,既简洁又灵活。
直接传 Lambda 给 sort 或 sorted
Comparator 是函数式接口,Lambda 可直接作为参数传入:
- 按字符串长度升序:list.sort((s1, s2) -> Integer.compare(s1.length(), s2.length()))
- 按年龄降序(注意参数顺序):list.sort((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()))
- Stream 中使用:list.stream().sorted((u1, u2) -> u1.getName().compareTo(u2.getName())).collect(Collectors.toList())
用 comparing 链式构建多字段排序
单靠 Lambda 写复杂条件容易混乱,comparing + thenComparing 更清晰、可读性强:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 先按年龄升序,再按姓名字典序:Comparator.comparing(Person::getAge).thenComparing(Person::getName)
- 第二级用降序:.thenComparing(Person::getScore, Comparator.reverseOrder())
- 字段可能为 null?加 null 安全处理:comparing(Person::getName, Comparator.nullsLast(String::compareTo))
适配不同数据结构和场景
Lambda + Comparator 不限于 List,通用性很强:
立即学习“Java免费学习笔记(深入)”;
- 数组排序:Arrays.sort(personArray, Comparator.comparing(Person::getAge))
- Stream 排序:list.stream().sorted(Comparator.comparing(User::getLevel).reversed()).collect(...)
- 方法引用简化单字段排序:Comparator.comparingInt(String::length) 或 Comparator.comparing(Person::getName)
避开常见陷阱
写错一个符号或顺序,结果就反了:
- 返回负数表示第一个参数应排在前面,别把 p1 和 p2 位置写反
- 基本类型比较慎用减法(如 a - b),可能整型溢出;优先用 Integer.compare(a, b)
- reversed() 是对已有 Comparator 实例取反,reverseOrder() 是生成新的逆序比较器(如用于 String.CASE_INSENSITIVE_ORDER.reversed())
- list.sort() 是就地修改,stream().sorted() 返回新流,原集合不变

















