侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用Lambda表达式实现Comparator接口排序

2025-12-9 / 0 评论 / 4 阅读

题目

使用Lambda表达式实现Comparator接口排序

信息

  • 类型:问答
  • 难度:⭐

考点

Lambda表达式,函数式接口,Comparator接口

快速回答

使用Lambda表达式实现Comparator接口的步骤:

  1. 理解Comparator是函数式接口,可直接用Lambda实现
  2. 掌握Lambda基本语法:(参数) -> 表达式
  3. 通过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()等默认方法