题目
使用Lambda表达式实现Comparator接口排序
信息
- 类型:问答
- 难度:⭐
考点
Lambda表达式,函数式接口,Comparator接口
快速回答
使用Lambda表达式实现Comparator接口的步骤:
- 理解Comparator是函数式接口,可直接用Lambda实现
- 掌握Lambda基本语法:
(参数) -> 表达式 - 通过
Collections.sort()或List.sort()应用自定义排序
原理说明
Java 8的Lambda表达式允许简洁地实现函数式接口(仅含一个抽象方法的接口)。Comparator接口的compare(T o1, T o2)方法天然支持Lambda实现,用于定义对象排序规则。
代码示例
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class LambdaSortExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 使用Lambda实现Comparator(按字符串长度升序)
names.sort((s1, s2) -> s1.length() - s2.length());
System.out.println(names); // 输出: [Bob, Alice, Charlie]
// 方法引用简化版(按字符串长度降序)
names.sort(Comparator.comparingInt(String::length).reversed());
}
}最佳实践
- 优先使用
Comparator.comparing()链式调用(如Comparator.comparing(Person::getAge).thenComparing(Person::getName)) - 对数值类型使用
comparingInt/comparingDouble避免装箱开销 - 复杂逻辑可用方法引用替代Lambda(如
String::length)
常见错误
- 错误1:忘记Lambda参数类型推断规则
// 错误:当有多个参数且类型不同时需显式声明类型 Comparator<String> wrong = (s1, s2) -> s1.compareTo(s2); // 正确 // Comparator<String> error = (String s1, s2) -> ... // 编译错误 - 错误2:混淆升降序
// 升序:o1 - o2(数值类型),降序:o2 - o1 或使用 reversed() names.sort((s1, s2) -> s2.length() - s1.length()); // 正确降序
扩展知识
- 函数式接口:Lambda本质是实现了
@FunctionalInterface注解的接口(如Runnable、Comparator) - 方法引用:进一步简化Lambda(四种形式:静态方法、实例方法、构造方法、任意对象方法)
- Comparator增强:Java 8新增
reversed()、thenComparing()等默认方法