一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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?加 nullsLastnullsFirstcomparing(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() 是就地修改

热门栏目