169. Java Lambda 表达式 - 使用自然顺序比较对象

169. Java Lambda 表达式 - 使用自然顺序比较对象

🌱 什么是自然顺序?

Java 中,如果一个类实现了 Comparable<T> 接口,就定义了它的自然顺序 。这种顺序是通过 compareTo(T other) 方法来实现的。例如:

java 复制代码
String a = "apple";
String b = "banana";
System.out.println(a.compareTo(b)); // 返回负数,说明 a < b

🎯 常见实现了 Comparable 的类:

以下类都实现了 Comparable,因此可以使用自然顺序比较:

  • String
  • 所有包装类:Integer, Long, Double, Boolean
  • Java 8 日期时间类:LocalDate, LocalTime, LocalDateTime
  • 自定义实现 Comparable<T> 的类

🛠️ Comparator.naturalOrder():工厂方法

当你想基于自然顺序构建比较器时,不需要手写 compareTo(),直接使用:

java 复制代码
Comparator<String> natural = Comparator.naturalOrder();

这个比较器会自动使用对象的 compareTo() 实现。


🧩 实战示例:先按长度比,再按自然顺序比

我们有一组字符串,要求按长度升序排列,如果长度相同,再按字母顺序排。

java 复制代码
List<String> strings = Arrays.asList("one", "two", "three", "four", "five");

🔧 代码实现如下:

java 复制代码
import static java.util.Comparator.naturalOrder;

Comparator<String> byLengthThenAlphabetically =
    Comparator.comparing(String::length)
              .thenComparing(naturalOrder());

strings.sort(byLengthThenAlphabetically);
System.out.println(strings);

🖨️ 输出结果:

java 复制代码
[one, two, five, four, three]

解释:

  • 首先比较字符串长度:
    • 长度为 3:"one", "two"
    • 长度为 4:"five", "four"
    • 长度为 5:"three"
  • 长度相同则按字母排序:
    • "five""four"
    • "one""two"

🚀 对比另一个工厂方法:Comparator.reverseOrder()

如果你希望反向使用自然顺序,也有对应的工厂方法:

java 复制代码
Comparator<String> reverse = Comparator.reverseOrder();

比如按字母倒序排序:

java 复制代码
strings.sort(reverse);
System.out.println(strings);

✅ 小结

方法 说明
Comparator.naturalOrder() 使用对象的 compareTo() 比较,自然顺序
Comparator.reverseOrder() 自然顺序的反向顺序
thenComparing(...) 用于多级比较:如果主比较器结果为 0,使用后续比较器

🧠 思考练习题

假设你有一个类 Book

java 复制代码
class Book {
    String title;
    int pages;
    // getter 省略
}

🔹 请实现一个比较器,按照页数升序排序,如果页数相同,再按书名的字母顺序排序。

相关推荐
程序员黑豆3 小时前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
桦说编程5 小时前
并发编程中的等待-通知模式:从 wait/notify 到 Guava Monitor
后端
bugcome_com5 小时前
JWT 知识小课堂:从入门到精通,一文吃透 JSON Web Token
前端·json
To_OC6 小时前
写了三天 Next.js,我的 React 世界观被拆了又装回去
前端·全栈·next.js
独泪了无痕6 小时前
viewer.js 安装与配置指南:实现图片预览功能
前端·vue.js
用户938515635077 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
用户938515635077 小时前
实战 Todo CRUD —— 从路由到异常,手写一个完整模块
后端·typescript·nestjs
GetcharZp7 小时前
Qdrant 向量数据库 Golang 实战指南:从零构建高性能检索应用
后端
hsfxuebao8 小时前
OpenSpec 完整使用流程笔记 (SDD)
后端
唐青枫8 小时前
别把 struct 只当成数据盒子:Zig 结构体从入门到实战
后端