java中stream获取最值需用max()/min()并传comparator,返回optional需安全解包;基本类型优先用intstream等专用流;自定义对象需指定比较逻辑。

Java 中用 Stream 获取最大值和最小值,主要靠 max() 和 min() 方法,它们都返回 Optional<t></t>,因为流可能为空。
需要提供比较器(Comparator)
这两个方法不接受无参调用,必须传入一个 Comparator 来定义“谁更大/更小”。对基本类型包装类或实现了 Comparable 的类,可以用 Comparator.naturalOrder();自定义对象需自己写比较逻辑。
-
错误写法:
stream.max()—— 编译不通过 -
正确写法:
stream.max(Comparator.naturalOrder()) - 字符串按字典序:
stream.min(String::compareTo)或Comparator.naturalOrder()
处理 Optional 避免 NoSuchElementException
流为空时,max()/min() 返回空的 Optional,直接调用 get() 会抛异常。推荐用以下方式安全取值:
-
optional.orElse(null)—— 为空时给默认值(如 null、0、-1) -
optional.orElseThrow(() -> new RuntimeException("空流"))—— 显式报错 -
optional.ifPresent(System.out::println)—— 仅在有值时执行操作 -
optional.orElseGet(() -> computeDefault())—— 懒加载默认值
对基本类型建议用专用流(IntStream 等)
如果处理的是 int、long、double,优先用对应原始类型流,它们的 max()/min() 返回 OptionalInt 等,且提供 orElse(0) 这类更简洁的解包方式:
list.stream().mapToInt(Integer::intValue).max().orElse(-1)-
IntStream.of(3, 1, 4).min().orElse(0)→ 返回1 - 避免装箱开销,性能更好,代码也更直观
自定义对象要重写比较逻辑
比如有个 Person 类,想按年龄找最年长者:
people.stream().max(Comparator.comparing(Person::getAge))- 支持链式比较:
Comparator.comparing(Person::getAge).thenComparing(Person::getName) - 注意:若
getAge()可能为 null,要用comparing(…, Comparator.nullsLast(Integer::compareTo))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











