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"
- 长度为 3:
- 长度相同则按字母排序:
"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 省略
}
🔹 请实现一个比较器,按照页数升序排序,如果页数相同,再按书名的字母顺序排序。