guava的ordering不实现comparable,而是复用已实现comparable类型的compareto()方法;通过natural()、onresultof()、thencomparing()等链式调用组合自然序排序逻辑,并支持null处理与comparator互操作。

Guava 的 Ordering 工具类本身不直接实现或“映射” Comparable 接口,而是**复用并封装**已实现 Comparable 的类型,通过链式调用构建更灵活、可组合的比较逻辑。
基于 Comparable 的默认排序
Ordering.natural() 是最基础的链式起点,它要求泛型类型 T 必须实现 Comparable<t></t>。该方法返回一个按自然序排序的 Ordering 实例,内部直接委托给对象自身的 compareTo() 方法。
- 例如:
Ordering.natural().sortedCopy(ImmutableList.of("zebra", "apple", "banana"))按字典序排列 - 若传入未实现
Comparable的类型(如自定义类未实现该接口),运行时抛出ClassCastException
将 Comparable 字段提取为链式比较依据
当需要按对象的某个 Comparable 字段排序时,使用 onResultOf() 或更语义化的 byNaturalOrder() 配合函数式提取:
-
Ordering.byNaturalOrder().onResultOf(Person::getAge):假设getAge()返回Integer(实现了Comparable) - 等价于
Ordering.natural().onResultOf(Person::getAge),本质仍是复用Integer.compareTo() - 字段必须非 null,否则触发
NullPointerException;如需容忍 null,需额外调用nullsFirst()或nullsLast()
多级排序中逐层复用 Comparable 逻辑
链式调用的核心优势在于组合多个 Comparable 维度。每个 thenComparing() 后续步骤仍可基于自然序或其他 Comparable 字段:
Ordering.natural().onResultOf(Person::getName).thenComparing(Ordering.natural().onResultOf(Person::getAge))- 先按姓名自然序排,姓名相同时再按年龄自然序排
- 每级都依赖字段类型的
compareTo(),无需额外编写比较器逻辑
与 Comparator 的互操作不改变 Comparable 本质
Ordering.from(Comparator) 可桥接任意比较器,但若该 Comparator 内部仍调用 Comparable.compareTo()(如 Comparator.comparing(Person::getName)),则底层依然在使用 Comparable 协议。
- Guava 不重写
Comparable行为,也不生成新实现类 - 所有链式操作最终都会归结为对
Comparable对象的compareTo()调用,或对Comparator的compare()调用 - 真正“映射”的是设计意图:把类型自带的可比性,转化为可组合、可复用、支持 null 处理的排序能力
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











