文章目录
- 286. Java Stream API - 使用Stream.iterate(...)创建流
- ✅ 核心概念
- 🔨 基本用法:经典 iterate 模式
- 📦 输出结果:
- ⚠️ 依然是“无限流”,记得加上 `.limit()`!
- 🆕 Java 9 起:带有 **终止条件的 iterate**
- 🧪 再来一个数字序列的例子
- 📚 小结
- 💡 何时用 iterate vs generate?
- 🧠 小练习(培训互动)
286. Java Stream API - 使用Stream.iterate(…)创建流
✅ 核心概念
Stream.iterate(...)是另一种创建无限流的方式。
与generate()不同的是,它不是每次都从零开始生成一个独立的值,而是从一个初始值(seed)开始,通过一个一元操作符(UnaryOperator)不断“推演”出下一个值。
🔨 基本用法:经典 iterate 模式
Stream<String>iterated=Stream.iterate("+",s->s+"+");iterated.limit(5L).forEach(System.out::println);📦 输出结果:
+++++++++++++++🧠 解读:
- 起始值为
"+"; - 每个元素等于上一个字符串后再拼接一个
+; - 使用
.limit(5)截断无限流,只取前 5 个。
✅ 适合用于序列、递增值、字符串生成、指数增长等场景。
⚠️ 依然是“无限流”,记得加上.limit()!
如果不加.limit(),程序会无限运行,不断生成更长的字符串(最终可能崩溃 ⛔)。
🆕 Java 9 起:带有终止条件的 iterate
Java 9 引入了Stream.iterate(seed, predicate, operator),你可以像写循环一样设置“何时停止”。
Stream<String>iterated=Stream.iterate("+",s->s.length()<=5,s->s+"+");iterated.forEach(System.out::println);输出结果:
+++++++++++++++🧠 解读:
- 只有当
s.length() <= 5时才继续; - 超过这个条件,流自动终止,无需
.limit()。
就像一个带判断的while循环!
🧪 再来一个数字序列的例子
Stream<Integer>evens=Stream.iterate(0,n->n+2);evens.limit(5).forEach(System.out::println);输出:
02468🎯 每个数字是前一个的 +2,非常适合用于递增逻辑。
📚 小结
| 方法签名 | 用途 |
|---|---|
Stream.iterate(seed, UnaryOperator) | 无限推演序列,需要配合.limit() |
Stream.iterate(seed, predicate, UnaryOperator) | 带终止条件的有限流,无需.limit() |
💡 何时用 iterate vs generate?
| 特点 | Stream.generate(...) | Stream.iterate(...) |
|---|---|---|
| 是否依赖前一个元素 | ❌ 否 | ✅ 是 |
| 是否等价于循环 | ❌ 不像循环 | ✅ 类似循环 |
| 是否适合递增/变形 | ❌ 不适合 | ✅ 适合 |
| 是否生成重复值 | ✅ 常用于生成常量 | ❌ 每次不同 |
🧠 小练习(培训互动)
填空题:
Stream<Integer>squares=Stream.iterate(1,___,n->n*n).limit(3);squares.forEach(System.out::println);❓该写什么逻辑才能输出:
111🤔 答案:
Stream<Integer>squares=Stream.iterate(1,n->true,n->1)