stream.generate()创建无限流,需用limit()等截断;支持常量、构造器、随机数生成;避免副作用,递增序列推荐用iterate()。

Stream.generate() 用于创建**无限流**,它接收一个 Supplier<t></t>,每次调用该 Supplier 就生成一个新元素。它本身不提供“终止”逻辑,所以必须配合 limit()、takeWhile()(Java 9+)等中间操作来截断,否则终端操作(如 forEach)会无限执行。
生成常数无限流
只要 Supplier 总是返回同一个值即可。例如生成无限个 "Hello":
Stream.generate(() -> "Hello")
.limit(5)
.forEach(System.out::println);
// 输出:Hello(5 次)
也可以用方法引用简化常量生成(前提是该常量有无参 getter 或静态 final 字段):
-
Stream.generate(() -> 42)→ 无限整数 42 -
Stream.generate(String::new)→ 无限个空字符串(调用无参构造)
生成随机数无限流
用 java.util.Random 或 ThreadLocalRandom(推荐,线程安全且高效)的实例方法作为 Supplier:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 随机整数(0–99):
Stream.generate(() -> ThreadLocalRandom.current().nextInt(100)) - 随机双精度浮点数(0.0–1.0):
Stream.generate(ThreadLocalRandom.current()::nextDouble) - 随机布尔值:
Stream.generate(ThreadLocalRandom.current()::nextBoolean)
⚠️ 注意:不要写成 Stream.generate(new Random()::nextInt) —— 这会为每个元素新建 Random 实例,导致种子相同、结果重复;应复用同一个 Random 或优先用 ThreadLocalRandom.current()。
常见组合用法
实际中常搭配以下操作使用:
-
.limit(n):取前 n 个(最常用) .takeWhile(x -> x :Java 9+,按条件截断(注意:对无限流慎用,需确保条件终将为 false)-
.skip(m).limit(n):跳过前 m 个,再取 n 个(模拟分页) -
.collect(Collectors.toList()):收集为列表(记得先 limit,否则 OOM)
不推荐的写法
避免在 Supplier 中做副作用操作(如修改外部变量、IO、同步锁),因为 Stream 可能并行执行(parallelStream()),行为不可预测。例如:
int[] counter = {0};
Stream.generate(() -> counter[0]++) // ❌ 并发下计数错乱
如需带状态的序列(如递增数列),改用 Stream.iterate() 更清晰安全:
Stream.iterate(0, n -> n + 1).limit(5) // 0,1,2,3,4
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










