286. Java Stream API - 使用Stream.iterate(...)创建流

文章目录

  • [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)
相关推荐
猿究院_夏燊5 小时前
Spring Bean 生命周期
java·后端·spring
Wang's Blog5 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河6 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年6 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Jlzn88886 小时前
华东电芯分选通道数怎么配才不堵线
java·人工智能·架构·自动化·制造
Williamtym6 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
香吧香6 小时前
GRPC连接机制---长连接分析
java·网络与传输协议
DongQiShanRen6 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室6 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python