文章目录
- 285. Java Stream API - 通过 Supplier 创建 Stream
- ✅ 基本概念
- 🧪 示例代码
- 💻 输出结果:
- ⚠️ 小心!这是个无限流!
- 🎯 正确使用方式:结合 **限制操作(short-circuiting)**
- 🧠 学习要点
- 📌 示例:生成时间戳
- 🧪 小练习题(可做培训互动)
- 📚 小结
285. Java Stream API - 通过 Supplier 创建 Stream
✅ 基本概念
Java的Stream接口提供了两个用于从Supplier(供应者)创建流的工厂方法,其中之一就是:
Stream.generate(Supplier<T>supplier)这个方法用于生成无限流(infinite stream):每当流需要一个新元素时,Supplier就会被调用一次来“供应”这个元素。
🧪 示例代码
Stream<String>generated=Stream.generate(()->"+");List<String>strings=generated.limit(5L).toList();System.out.println("strings = "+strings);💻 输出结果:
strings=[+,+,+,+,+]⚠️ 小心!这是个无限流!
❗ 如果你去掉
.limit(5L),这个程序将永远不会停止运行!
Stream<String>generated=Stream.generate(()->"+");generated.forEach(System.out::println);// ❌ 小心,死循环🚨 它将不停地生成+,直到你的内存耗尽,甚至抛出OutOfMemoryError!
🎯 正确使用方式:结合限制操作(short-circuiting)
在Stream API中,像limit()这样的操作被称为短路操作(short-circuiting operations)。它的作用是“提前终止流的生成或处理”。
✅ 加上
limit(n),我们就可以从无限流中“截取”前n个元素使用。
Stream<Double>randoms=Stream.generate(Math::random);List<Double>topFive=randoms.limit(5).toList();System.out.println(topFive);// 打印 5 个随机数🧠 学习要点
| 关键点 | 说明 |
|---|---|
Stream.generate(...) | 会创建一个无限的流 |
必须使用limit()或其他短路操作 | 否则程序会永远运行或耗尽资源 |
| 适合生成固定模式、常量、随机数等 | 比如"++++++++"或随机数序列 |
| 每次调用都会重新获取一个值 | 这与of(...)或Arrays.stream(...)是静态集合不同 |
📌 示例:生成时间戳
Stream<String>timeStream=Stream.generate(()->Instant.now().toString());List<String>timestamps=timeStream.limit(3).toList();System.out.println(timestamps);输出三个不同时间戳,适合用于日志采样、延迟任务等场景。
🧪 小练习题(可做培训互动)
问:以下代码会输出几个"Hello"?
Stream.generate(()->"Hello").limit(3).forEach(System.out::println);答案:
HelloHelloHello📚 小结
Stream.generate(...)= 无限供应机,每次都生产一个元素。- 不加限制操作就是“失控的水龙头 💦”,必须加上
.limit()、.takeWhile()等手段节流。 - 适合用于生成常量、重复元素、随机值、当前时间等“动态”数据。