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

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

相关推荐
CCblandy14 分钟前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
我是人✓16 分钟前
SpringBoot项目的五种创建方式
java·spring boot·后端
原则猫16 分钟前
UDP 到底怎么实现可靠的
前端
Java后端的Ai之路20 分钟前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
裕晟资质规划2 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
念念清晰2 小时前
000-OpenJDK17 源码构建:MacOS环境(M芯片)
java·后端
ShineWinsu2 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
月夏2 小时前
Vue3 转 React:18 项对照表 + 5 个必踩的坑(附 7 天上手路线)
前端
广州华水科技2 小时前
单北斗GNSS位移监测系统的应用与维护解析
前端
来福猿2 小时前
SpringCloud Config 源码分析:配置拉取、刷新与多环境管理
后端·spring·spring cloud