Java中Lambda配合Comparator排序可简化匿名类、支持升序降序多字段及null安全:用list.sort()传Lambda或Comparator.comparing链式构建,适配数组、Stream等场景,注意比较逻辑、溢出及reversed与reverseOrder区别。
Java 中用 Lambda 表达式配合 Comparator 接口排序,核心是把原本冗长的匿名类写法压缩成一行简洁逻辑,既保持可读性,又支持升序、降序、多字段、null 安全等常见需求。
对 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())
单靠 Lambda 写复杂条件容易嵌套混乱,Comparator.comparing() 提供清晰链式调用:
Comparator.comparing(Person::getAge).thenComparing(Person::getName)
.thenComparing(Person::getScore, Comparator.reverseOrder())
nullsLast 或 nullsFirst:comparing(Person::getName, Comparator.nullsLast(String::compareTo))
Lambda + Comparator 不限于 List,通用性强:
立即学习“Java免费学习笔记(深入)”;
Arrays.sort(personArray, Comparator.comparing(Person::getAge))
list.stream().sorted(Comparator.comparing(Person::getName)).collect(Collectors.toList())
Comparator.comparingInt(String::length) 或 Comparator.comparing(Person::getName)
写 Lambda 时稍不留意就会出错或语义反向:
a - b),可能溢出;优先用 Integer.compare(a, b)
reversed() 和 reverseOrder() 作用对象不同:前者用于已有 Comparator 实例,后者用于生成逆序比较器(如 String.CASE_INSENSITIVE_ORDER.reversed())sorted() 返回新流,不改变原集合;List 的 sort() 是就地修改