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