本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
【腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
今天有个网友说,因为 AI 整个 Spring Cloud 的迭代都变慢了。
其实不止是 Spring Cloud,Java 也变慢了。最近的 JDK 版本,JEP 越来越少,不少 JEP 还是来回预览了好多次。AI 可能是一方面,需求等信特性变少了是另一方面,还有不少人参与社区共建的兴趣被转移了,综合来看情有可原。
大功能不多,小功能上可能还有惊喜。最近,我发现 JDK 26 中的 Comparator 接口迎来了史诗级增强!用 2 行代码替代原来 3 种方案,开发效率提升 50%。
所以,接下来,我就来说说这个 JDK 26 新特性,Comparator 终于可以直接比较两个对象了!
前言
2026 年 3 月 17,JDK 26 正式发布。在这个版本中,有一个看似微小却实用性极强的改进,java.util.Comparator 接口新增了两个默认方法 min(T, T) 和 max(T, T)。这个改进由 JetBrains 的工程师 Tagir Valeev 贡献,解决了 Java 开发者长期以来面临的一个痛点:如何优雅地比较两个对象并获取较大或较小者。
为什么需要这两个方法?
在我们的日常编程中,我们经常遇到下面这样的场景。
给定两个对象,需要根据某个比较器找出其中较大或较小的那个。在 JDK 26 之前,Java 开发者有几种选择,但都不够理想。
方案一,三元运算符
这是最常用的方案,但不够优雅。
String max = comp.compare(a, b) > 0 ? a : b;
这类代码的痛点是,需要重复写变量名 a 和 b,还要仔细匹配 > 或 < 符号与三元运算符的对应关系,代码可读性一般,还容易搞错 compare 的返回值对应的含义而出错。
方案二,Stream API
这个方案的问题是过度设计,或过度包装。
String max = Stream.of(a, b).max(comp).get();
上面的代码,虽然看起来语义清晰,但会创建不必要的 Optional 对象(我们知道流中至少有两个元素,结果一定存在),而且根据 JIT 编译器的不同,可能产生显著的性能开销和堆内存分配。
方案三,BinaryOperator
这个方案略显冗长且不直观。
String max = BinaryOperator.maxBy(comp).apply(a, b);
从上面的代码也可以看出,这是现有方案中字符数最多的,虽然相对清晰,但不够直观,还会创建不必要的函数对象。如果比较器定义在更抽象的类型上,还需要显式指定类型参数。
Comparator<CharSequence> comp = Comparator.comparingInt(CharSequence::length);
// 这里 <String> 类型参数是必需的
String max = BinaryOperator.<String>maxBy(comp).apply("long", "short");
所以,就有人提出并贡献了新的方案。
文章配图参见 https://mp.weixin.qq.com/s/6JVvQQZdWoQlYQhSYQEFtA。
JDK 26 的解决方案
JDK 26 为 Comparator 接口新增了两个默认方法。
public interface Comparator<T> {
// ... 其他方法
default <U extends T> U max(U o1, U o2) {
return compare(o1, o2) > 0 ? o1 : o2;
}
default <U extends T> U min(U o1, U o2) {
return compare(o1, o2) > 0 ? o2 : o1;
}
}
现在,代码变得异常简洁直观。
Comparator<String> byLength = Comparator.comparingInt(String::length);
// 直接调用比较器的方法
System.out.println(byLength.max("cat", "giraffe")); // 输出: giraffe
System.out.println(byLength.min("cat", "giraffe")); // 输出: cat
// 甚至可以这样用
String bigger = String.CASE_INSENSITIVE_ORDER.max("Hello", "world");
这种设计与 Math.max() 和 Math.min() 方法风格一致,完美融入 Java 标准库。
使用场景
根据上面的代码,我们可以想出这两个方法特别适合以下场景。
- 两值比较:当只需要比较两个对象时,无需创建集合或流
- 链式比较:在复杂比较逻辑中快速选取极值
- 配置选择:根据某些条件在两个配置对象中选择更优者
- 边界处理:在算法实现中频繁需要取较大/较小值的场景
演进历程
从社区讨论到正式落地,这个特性的演进过程体现了 OpenJDK 社区的协作精神。
提案提出
2025 年 5 月,Tagir Valeev 在 core-libs-dev 邮件列表发起了初步讨论 ,提出了为 Comparator 接口添加 min 和 max 默认方法的想法。他指出,这是一个在编写 Java 程序时经常遇到的需求,现有方案要么过于冗长,要么性能不佳。
社区讨论与迭代
2025 年 5 月 – 9 月,这段时间提案在 core-libs-dev 列表中进行了充分讨论。开发者们讨论了方法签名、泛型参数设计以及与其他现有 API 的兼容性。最初的讨论还提到了是否应该在 java.util.Objects 中添加静态方法,最终确定在 Comparator 接口中添加默认方法是最佳方案。
代码审查
2025 年 9 月,在方案和代码实现确定后,经过多轮代码审查(RFR: Request For Review),最终版本确定了方法签名使用泛型边界 <U extends T>,这样可以支持更灵活的类型使用场景。
正式发布
2026 年 3 月,该特性随 JDK 26 正式发布,Release Note 中明确说明:“New default methods min() and max() are added to the java.util.Comparator interface, which allow finding greater or smaller of two objects, according to this Comparator without changing existing implementations of the comparator.”
历史渊源
值得一提的是,类似的增强提案早在多年前就有过(JDK-4254492),但当时 Java 还没有引入默认方法(Default Methods)这一特性而作罢。后来 Java 8 引入的默认方法机制让这次改进成为可能,这样可以在不破坏现有 Comparator 实现的情况下,为接口添加新的实用方法。
对生态的影响
这个改动虽然微小,但对 Java 生态产生了积极影响。
- IDE 支持:IntelliJ IDEA 已经计划添加检查,建议开发者使用新的
comparator.max/min方法替代手动实现 - 代码简化:大量现有的冗长比较代码可以被简化
- 性能提升:避免了 Stream 方案的开销
需要注意的是,这个改动也对一些其他 JVM 语言产生了兼容性影响。例如 Scala 2.13.x 中的 Ordering 特质继承了 Comparator,新默认方法与 Ordering 中已有的 min/max 方法产生了冲突,需要显式覆盖解决。
总结
JDK 26 中 Comparator 新增的 min(T, T) 和 max(T, T) 默认方法,是一个典型的“小而美”的改进。它没有引入复杂的概念,却解决了开发者日常编码中的真实痛点。
从 2025 年 5 月的社区提案到 2026 年 3 月的正式 release,这个特性展示了 OpenJDK 社区如何通过协作持续改进 Java 平台。
对于 Java 开发者来说,升级到 JDK 26 后,可以立即享受这一便利,只需直接调用比较器对象的 min 或 max 方法,代码将变得更加简洁、可读、高效。
参考链接
- JDK Bug Tracker:
https://bugs.openjdk.org/browse/JDK-8356995 - OpenJDK Release Notes:
https://jdk.java.net/26/release-notes - core-libs-dev 讨论:
https://mail.openjdk.org/pipermail/core-libs-dev/2025-May/145638.html

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » JDK 26 Comparator 接口新特性,新增默认方法 min 和 max