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 省略
}

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

相关推荐
武子康31 分钟前
大数据-118 - Flink 批处理 DataSet API 全面解析:应用场景、代码示例与优化机制
大数据·后端·flink
不要再敲了35 分钟前
Spring Security 完整使用指南
java·后端·spring
IT_陈寒38 分钟前
Redis 高性能缓存设计:7个核心优化策略让你的QPS提升300%
前端·人工智能·后端
井柏然1 小时前
从 npm 包实战深入理解 external 及实例唯一性
前端·javascript·前端工程化
羊锦磊1 小时前
[ vue 前端框架 ] 基本用法和vue.cli脚手架搭建
前端·vue.js·前端框架
brzhang1 小时前
高通把Arduino买了,你的“小破板”要变“AI核弹”了?
前端·后端·架构
她说..1 小时前
通过git拉取前端项目
java·前端·git·vscode·拉取代码
智能化咨询2 小时前
玩转ClaudeCode:通过Chrome DevTools MCP实现高级调试与反反爬策略
前端·chrome·chrome devtools
Roadinforest2 小时前
水墨风鼠标效果实现
前端·javascript·vue.js
程序猿阿越2 小时前
Kafka源码(六)消费者消费
java·后端·源码阅读