最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java中 Comparator 接口如何用 Lambda 表达式排序
时间:2026-07-14 09:33:46 编辑:袖梨 来源:一聚教程网
Java中Lambda配合Comparator排序可简化匿名类、支持升序降序多字段及null安全:用list.sort()传Lambda或Comparator.comparing链式构建,适配数组、Stream等场景,注意比较逻辑、溢出及reversed与reverseOrder区别。
Java 中用 Lambda 表达式配合 Comparator 接口排序,核心是把原本冗长的匿名类写法压缩成一行简洁逻辑,既保持可读性,又支持升序、降序、多字段、null 安全等常见需求。
直接传 Lambda 给 sort 方法
对 List 排序时,直接调用 list.sort() 并传入 Lambda 即可,编译器能自动推断类型:
- 按字符串长度升序:
list.sort((s1, s2) -> Integer.compare(s1.length(), s2.length())) - 按整数字段降序(如年龄):
list.sort((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge())) - 更推荐用内置工具反转:
list.sort(Comparator.comparing(Person::getAge).reversed())
用 comparing 链式构建多级排序
单靠 Lambda 写复杂条件容易嵌套混乱,Comparator.comparing() 提供清晰链式调用:
- 先按年龄升序,再按姓名字典序:
Comparator.comparing(Person::getAge).thenComparing(Person::getName) - 第二级用降序:
.thenComparing(Person::getScore, Comparator.reverseOrder()) - 某字段可能为 null?加
nullsLast或nullsFirst:comparing(Person::getName, Comparator.nullsLast(String::compareTo))
适配不同场景:数组、Stream、集合
Lambda + Comparator 不限于 List,通用性强:
立即学习“Java免费学习笔记(深入)”;
- 数组排序:
Arrays.sort(personArray, Comparator.comparing(Person::getAge)) - Stream 排序:
list.stream().sorted(Comparator.comparing(Person::getName)).collect(Collectors.toList()) - 方法引用简化写法(适合单字段):
Comparator.comparingInt(String::length)或Comparator.comparing(Person::getName)
注意几个易错点
写 Lambda 时稍不留意就会出错或语义反向:
- 返回负数表示“前面元素应排在前面”,别把 a、b 顺序写反
- 基本类型比较慎用减法(如
a - b),可能溢出;优先用Integer.compare(a, b) -
reversed()和reverseOrder()作用对象不同:前者用于已有 Comparator 实例,后者用于生成逆序比较器(如String.CASE_INSENSITIVE_ORDER.reversed()) - Stream 的
sorted()返回新流,不改变原集合;List 的sort()是就地修改
相关文章
- 以下哪种职业的执业人员具有审计签字权 蚂蚁新村今日答案2026.1.14 07-14
- 蚂蚁新村今日答案1.14 07-14
- 蚂蚁新村2026年1月14日答案最新 07-14
- 蚂蚁庄园小鸡答题今日答案2026年1月15日 07-14
- 蚂蚁庄园今日最新答案1.15 07-14
- 蚂蚁庄园今日答案最新2026.1.15 07-14