java中lambda与comparator结合排序本质是用简洁函数替代匿名内部类,支持直接传lambda、comparing链式构建及多行逻辑处理,适配list、数组和stream等场景。

Java 中 Lambda 表达式与 Comparator 结合排序,本质是用一行函数替代冗长的匿名内部类,把“怎么比”直接写清楚。Comparator 是函数式接口(只有一个 compare 方法),天然适配 Lambda,写起来简洁,逻辑也更聚焦业务本身。
基础写法:直接传 Lambda 给 sort 或 sorted
对 List 就地排序,调用 list.sort();对 Stream 生成新序列,用 .sorted():
- 字符串按长度升序:
list.sort((s1, s2) -> Integer.compare(s1.length(), s2.length())) - Person 按年龄降序:
list.sort((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge())) - Stream 中按姓名排序:
list.stream().sorted((u1, u2) -> u1.getName().compareTo(u2.getName())).collect(...)
推荐方式:用 comparing 链式构建,清晰又安全
单字段简单排序可用 Lambda,但多条件、null 处理、升降序混搭时,Comparator.comparing() 更可靠:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先按年龄升序,再按姓名字典序:
Comparator.comparing(Person::getAge).thenComparing(Person::getName) - 第二级用降序:
.thenComparing(Person::getScore, Comparator.reverseOrder()) - 姓名可能为 null?加
nullsLast:comparing(Person::getName, Comparator.nullsLast(String::compareTo)) - 基本类型字段(如 int)优先用
comparingInt,避免装箱:comparingInt(Person::getAge)
处理复杂逻辑:Lambda 内写代码块
当排序规则含 if 判断、状态映射或计算时,Lambda 支持大括号写多行逻辑,但必须确保返回 int 且语义正确:
- ACTIVE 状态优先,再按创建时间倒序:
(p1, p2) -> {<br> int status = Boolean.compare(p1.getStatus().equals("ACTIVE"), p2.getStatus().equals("ACTIVE"));<br> if (status != 0) return status;<br> return Long.compare(p2.getCreatedAt(), p1.getCreatedAt());<br> } - 注意:比较结果负数表示 p1 应排在 p2 前,别把参数顺序和返回值符号弄反
适配不同场景:数组、Stream、集合通用
Lambda + Comparator 不绑定特定容器,灵活复用:
- 数组排序:
Arrays.sort(personArray, Comparator.comparing(Person::getName)) - Stream 排序后收集:
list.stream().sorted(comparing(Person::getSalary).reversed()).toList() - 注意区别:
list.sort()修改原列表;stream().sorted()返回新流,原集合不变
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










