Java中stream().max()和min()需传Comparator返回Optional<T>,正序用naturalOrder()、反序用reverseOrder(),空流需用orElse等安全处理,自定义对象需comparing,注意null安全和性能。

Java 中用 stream().max() 和 stream().min() 查找极值,核心是传入一个 Comparator 来定义“谁更大、谁更小”。它们返回的是 Optional<T>,因为流可能为空,必须安全处理。
必须传 Comparator,不能直接调用
这两个方法没有无参重载。哪怕元素类型实现了 Comparable(比如 Integer、String),也得显式提供比较逻辑,常用 Comparator.naturalOrder() 或 Comparator.reverseOrder():
- 正序取最大:用
Comparator.naturalOrder()—— 对Integer就是数值越大越靠前,所以 max 是最大数 - 正序取最小:同样用
Comparator.naturalOrder()—— min 就是最小数 - 反序取最大:用
Comparator.reverseOrder()—— 此时“最大”其实是原顺序里最小的那个
正确获取结果:别忘了 isPresent() 和 get() 或 orElse()
返回值是 Optional,直接调用 get() 会抛 NoSuchElementException(空流时)。推荐写法:
- 有默认值就用
orElse(0)、orElse(null)、orElseThrow(() -> new RuntimeException("空集合")) - 想进一步处理就用
ifPresent(System.out::println)或map(...).orElse(...)
自定义对象要自己写 Comparator
比如有个 Person 类,按年龄找最年长者:
立即学习“Java免费学习笔记(深入)”;
- 用 lambda:
people.stream().max(Comparator.comparing(p -> p.getAge())) - 用方法引用:
people.stream().max(Comparator.comparing(Person::getAge)) - 多条件(先按年龄,年龄相同时按姓名):
Comparator.comparing(Person::getAge).thenComparing(Person::getName)
注意 null 安全和性能边界
如果数据中可能含 null,默认的 Comparator 会抛 NullPointerException。可用 Comparator.nullsFirst() 或 Comparator.nullsLast() 包一层:
stream().max(Comparator.nullsLast(Comparator.naturalOrder()))—— null 当作最大stream().min(Comparator.nullsFirst(Comparator.naturalOrder()))—— null 当作最小
另外,这两个操作是终端操作,会触发整个流水线执行;对大数据量不建议反复调用,可一次收集后手动遍历更高效。


















