stream.generate()创建无限流,需用limit等短路操作终止;通过supplier生成元素,支持随机数、自然数序列、常量等场景,但须防无限执行、避免副作用且慎用并行。

Stream.generate() 用于创建一个**无限流(infinite stream)**,它不断调用提供的 Supplier 来生成元素,直到被显式终止(如 limit、findFirst、forEach 等短路操作)。
基本用法:传入 Supplier 生成元素
Supplier 是一个无参函数式接口,每次调用 get() 返回一个新值。generate 不会自动停止,必须配合终端操作限制数量或触发中断:
- 用 limit(n) 截取前 n 个元素
- 用 findFirst()、findAny() 获取首个匹配项
- 用 forEach() 配合 break 逻辑(需借助外部变量或异常,不推荐)
示例:生成 5 个随机整数
Stream.generate(() -> rand.nextInt(100))
.limit(5)
.forEach(System.out::println);
生成带状态的序列(如递增数列)
Supplier 本身无状态,但可通过外部变量或原子类维持状态。注意:多线程下需保证线程安全,单线程可直接用局部变量。
示例:生成从 1 开始的自然数序列(前 10 个)
AtomicInteger counter = new AtomicInteger(0);Stream.generate(() -> counter.incrementAndGet())
.limit(10)
.forEach(System.out::println);
生成常量或固定对象
适合创建重复值流,比如填充默认对象或测试数据:
Stream.generate(() -> "default").limit(3)
.forEach(System.out::println);
// 输出:default default default
注意事项与常见陷阱
- 必须限制长度:不加 limit 或其他短路操作会导致无限执行,程序卡死
- 不支持索引:generate 无法像 iterate 那样基于前一项计算后一项(如斐波那契),此时优先选 Stream.iterate()
- Supplier 应尽量无副作用:避免在 get() 中修改共享状态或做 I/O,否则行为不可预测
- 并行流慎用:generate 本身不保证顺序,若依赖生成顺序,应使用 sequential() 显式切换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











