Java Stream的max()和min()方法返回Optional<T>,需用Comparator定义比较规则,支持自然序、字段提取及链式比较,并须安全解包;空流或null元素需预处理。

Java 的 Stream API 提供了 max() 和 min() 方法,用于在流中查找最大值或最小值。它们返回 Optional<T>,因为流可能为空,必须安全处理空值情况。
基本用法:配合 Comparator
这两个方法都需要传入一个 Comparator 来定义“大小”规则。对基本包装类或实现了 Comparable 的类型,可直接用 Comparator.naturalOrder() 或其简写 Comparator.comparing(Function.identity()):
-
找整数流的最大值:
Optional<integer> max = list.stream().max(Integer::compareTo);</integer> -
找字符串流的字典最小值:
Optional<string> min = stream.min(String::compareTo);</string> -
更清晰写法(推荐):
stream.max(Comparator.naturalOrder());或stream.min(Comparator.naturalOrder());
按对象字段取极值
对自定义对象,常用 Comparator.comparing() 指定比较字段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
按年龄找最年长的人:
Optional<person> oldest = people.stream().max(Comparator.comparing(Person::getAge));</person> -
按姓名长度找最短名字(升序):
Optional<string> shortest = names.stream().min(Comparator.comparing(String::length));</string> -
支持链式比较(如先按年龄,年龄相同时按姓名):
.max(Comparator.comparing(Person::getAge).thenComparing(Person::getName))
处理空流与解包结果
返回的是 Optional,不能直接调用 get(),否则空流会抛 NoSuchElementException:
立即学习“Java免费学习笔记(深入)”;
-
安全获取值(提供默认):
Integer maxVal = numbers.stream().max(Integer::compareTo).orElse(0); -
只在存在时执行逻辑:
stream.max(...).ifPresent(System.out::println); -
抛出自定义异常:
.orElseThrow(() -> new RuntimeException("空集合无法取最大值"))
注意点和常见误区
max/min 不是终端操作的“性能最优解”——它会遍历全部元素;若只需一次遍历就同时拿到最大最小值,应改用 Collectors.summarizingInt/Long/Double 或自定义收集器。
-
错误示范(两次遍历):
int max = stream.max(...).orElse(0); int min = stream.min(...).orElse(0); // ❌ stream 已关闭,第二次调用报错 -
正确做法(复用同一 stream 或转为集合):
先收集到List,再多次操作;或用Stream.of(...).collect(Collectors.summarizingInt(...)) -
null 元素会导致 NullPointerException,确保数据非空或提前过滤:
stream.filter(Objects::nonNull).max(...)

















