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

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

相关推荐
techdashen1 分钟前
Cloudflare HTML 解析器的十年演化史(二)
前端·html
ZC跨境爬虫6 分钟前
Apple官网复刻第二阶段day_1:(导航栏模块化重构+工业化可复用UI落地)
前端·javascript·css·ui·重构
SamDeepThinking8 分钟前
秒杀下单,用户点一下按钮,后端要过六道关卡
java·后端·架构
代龙涛13 分钟前
WordPress archive.php 分类与归档页面开发指南
开发语言·后端·php·wordpress
天外飞雨道沧桑13 分钟前
Node.js在前端开发中扮演的角色
前端·node.js
梅梅绵绵冰16 分钟前
若依框架-智慧社区项目
前端·javascript·vue.js
烟雨孤舟22 分钟前
Django 后端项目企业级开发规范文档
后端·python·django
IT_陈寒23 分钟前
Vite开发爽是爽,但这个动态导入坑差点让我崩溃
前端·人工智能·后端
Mr_pyx28 分钟前
CompletableFuture 使用全攻略:从异步编程到异常处理
linux·前端·python
Hello--_--World29 分钟前
React:状态管理 官网笔记
前端·笔记·react.js