165. Java Lambda 表达式 - 用 Lambda 表达式实现比较器 Comparator

165. Java Lambda 表达式 - 用 Lambda 表达式实现比较器 Comparator

Java 8 之后,由于 Comparator<T> 接口被标注为 @FunctionalInterface,我们可以非常自然地用 Lambda 表达式来实现它!


Comparator<T> 接口回顾

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}

🔍 比较器的“契约”(约定):

关系 返回值
o1 小于 o2 负数
o1 等于 o2 0
o1 大于 o2 正数

此外:compare(o1, o2)compare(o2, o1) 应返回符号相反的值


🧪 实现一个整数比较器(自然顺序)

✅ 使用 Lambda 表达式:

Comparator<Integer> comparator = (i1, i2) -> Integer.compare(i1, i2);

✅ 使用方法引用(更简洁):

Comparator<Integer> comparator = Integer::compare;

推荐做法:✔️ 使用 Integer.compare() 而非 i1 - i2

为什么不推荐这样写?

Comparator<Integer> badComparator = (i1, i2) -> i1 - i2;

因为:

  • 在比较大整数时,i1 - i2 可能发生 整数溢出overflow)。
  • Integer.compare(i1, i2) 是安全的、推荐使用的方法。

🧩 示例:对字符串列表按长度排序

List<String> names = List.of("Tom", "Jerry", "Alexander");

List<String> sorted = new ArrayList<>(names);
sorted.sort((s1, s2) -> Integer.compare(s1.length(), s2.length()));
System.out.println(sorted);
// 输出: [Tom, Jerry, Alexander]

等价写法(方法引用):

sorted.sort(Comparator.comparingInt(String::length));

🧠 小结:

比较器创建方式 写法示例
使用 lambda (a, b) -> a.compareTo(b)
方法引用(推荐) String::compareToInteger::compare
避免 i1 - i2 Integer.compare(i1, i2) 替代

🧪 小练习:

  1. Lambda 写一个比较器,按字符串长度逆序排序。
  2. 尝试使用 List.sort() 和方法引用简化语法。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容