文章目录
- 302. Java Stream API - 提取最大值与最小值详解
- ✅ 为什么要学习 max/min 操作?
- 🔢 针对数字流的 max/min/average
- 📌 示例:处理数字流
- ✅ 注意:
- 🧱 针对对象流(Stream<T>)的 max/min
- 📌 与数值流不同:
- 🎬 示例:找出最长的字符串
- 输出:
- 🧨 可选值(Optional)如何安全处理?
- ⚠️ 如果直接使用 `get()` 或 `orElseThrow()`:
- 💬 课堂演示建议
- 🧪 练习建议(课堂互动):
- 🧾 总结
302. Java Stream API - 提取最大值与最小值详解
✅ 为什么要学习 max/min 操作?
在实际开发中,我们经常需要找出:
- 最长的字符串
- 最大的数字
- 最小的价格
- 评分最高的对象
Stream API 提供了非常直观的方法来实现这些需求。
🔢 针对数字流的 max/min/average
当我们处理的是数值类型的专用流(如IntStream、LongStream、DoubleStream),可以直接使用:
max()min()average()
这些方法都返回一个Optional 类型,因为:
🧠 它们没有 identity 元素—— 意思是,如果流为空,就无法计算结果。
📌 示例:处理数字流
IntStreamnumbers=IntStream.of(3,5,8,1,9);intmax=numbers.max().orElseThrow();System.out.println("最大值: "+max);✅ 注意:
如果你使用的是空流,比如IntStream.empty().max(),OptionalInt就会是空的,调用orElseThrow()会抛出NoSuchElementException。
🧱 针对对象流(Stream)的 max/min
📌 与数值流不同:
对象流中的元素可以是任何类型(如String、User、Order等),所以必须提供一个比较器 Comparator才能进行比较。
🎬 示例:找出最长的字符串
Stream<String>strings=Stream.of("one","two","three","four");Stringlongest=strings.max(Comparator.comparing(String::length)).orElseThrow();// 👈 保证流不为空才调用System.out.println("最长字符串是: "+longest);输出:
最长字符串是:three🧨 可选值(Optional)如何安全处理?
在使用max()、min()或average()后,返回的都是Optional类型:
Optional<T>(对象流)OptionalInt、OptionalDouble、OptionalLong(数值流)
⚠️ 如果直接使用get()或orElseThrow():
请确保你的流不为空!
否则你可能会遇到可怕的异常:
NoSuchElementException💬 课堂演示建议
| 场景 | 示例 | 使用方法 |
|---|---|---|
| 数值最大值 | IntStream.of(1, 2, 3).max() | 无需 Comparator |
| 最长字符串 | Stream.of("a", "bb").max(Comparator.comparing(String::length)) | 需要 Comparator |
| 平均值 | DoubleStream.of(3.0, 5.0).average() | 返回OptionalDouble |
| 空流防御 | orElse(默认值)/ifPresent()/isPresent() | 避免抛异常 |
🧪 练习建议(课堂互动):
recordProduct(Stringname,doubleprice){}Stream<Product>products=Stream.of(newProduct("A",15.0),newProduct("B",25.0),newProduct("C",10.0));// 找出最贵的产品ProductmostExpensive=products.max(Comparator.comparing(Product::price)).orElseThrow();System.out.println("最贵的产品是: "+mostExpensive);🧾 总结
| 方法 | 用途 | 返回类型 | 说明 |
|---|---|---|---|
max(Comparator) | 获取最大元素 | Optional<T> | 对象流 |
min(Comparator) | 获取最小元素 | Optional<T> | 对象流 |
IntStream.max() | 获取最大 int 值 | OptionalInt | 基本类型 |
average() | 计算平均值 | OptionalDouble等 | 也可能为空 |
orElse() | 设置默认值 | 值类型 | 安全方式 |
orElseThrow() | 异常处理 | 值类型 | 流必须非空 |