java stream的max/min方法通过comparator返回optional,支持链式比较、空值处理及反向排序;推荐用comparing()构建比较器,避免重复遍历可用teeing()或reduce。

Java Stream API 的 max 和 min 方法能直接根据比较器(Comparator)找出流中最大或最小的元素,返回 Optional 类型,安全处理空集合场景。
用法核心:传入 Comparator,返回 Optional
这两个方法不接受 lambda 表达式直接比较字段,而是必须传入一个 Comparator。常用写法是用 Comparator.comparing() 构建,支持链式调用(如 thenComparing)处理多级排序逻辑。
-
stream.max(Comparator.comparing(Person::getAge))→ 找年龄最大的人 -
stream.min(Comparator.comparing(Product::getPrice).thenComparing(Product::getName))→ 先比价格,价格相同时按名称升序取最小 - 结果始终是
Optional<t></t>,务必判空再调用get()或用orElse()/orElseThrow()
常见字段类型支持与注意事项
对基本类型包装类(Integer、Double)、String、实现了 Comparable 的类型,可直接用 comparing();对自定义对象,需确保比较字段非 null,否则抛 NullPointerException。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 防空推荐写法:
Comparator.comparing(p -> p.getScore(), Comparator.nullsLast(Comparator.naturalOrder())) - 反向排序:用
comparing(...).reversed(),比如min(comparing(...).reversed())等价于max(comparing(...)) - 原始类型字段(如
int)建议先转为包装类,或用comparingInt()等专用方法提升性能(避免自动装箱)
替代方案:避免重复遍历
如果既要最大值又要最小值,不建议分别调用 max 和 min(触发两次终端操作)。可用 Collectors.teeing()(Java 12+)一次完成:
var result = list.stream()
.collect(teeing(
maxBy(comparing(Person::getAge)),
minBy(comparing(Person::getAge)),
AbstractMap.SimpleEntry::new
));
或者手动用 reduce 做一次遍历聚合(适合老版本 JDK)。
实际使用小提醒
极值查找本质是归约操作,时间复杂度 O(n),无需提前排序;但注意 Stream 是一次性消费的,多次调用 max/min 需重新获取流。
- 集合为空时返回
Optional.empty(),别忘了处理,例如:stream.max(...).orElse(null) - 若比较逻辑复杂,可单独定义静态
Comparator常量,提高可读性和复用性 - 并行流下
max/min仍保证正确性,内部已做合并处理
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










