可使用stream.generate()配合threadlocalrandom创建无限随机流,如stream.generate(() -> threadlocalrandom.current().nextint(1, 101)),需用limit()等截断避免oom。

可以使用 Stream.generate() 配合一个返回随机值的 lambda 表达式或方法引用,来创建无限长度的随机数据流。关键在于:生成器函数必须是无参的、不修改状态的 Supplier,并每次调用都返回新值。
使用 Lambda 创建随机整数流
最常见的是结合 java.util.Random 或 ThreadLocalRandom(推荐用于并发场景):
-
ThreadLocalRandom.current().nextInt(1, 101)每次生成 1~100 的随机整数 - 传入
Stream.generate(() -> ThreadLocalRandom.current().nextInt(1, 101)) - 注意:不能复用同一个
Random实例并调用nextXXX()方法,除非确保线程安全;ThreadLocalRandom更安全简洁
生成其他类型随机数据的示例
只需替换 lambda 中的表达式即可:
- 随机小数:
Stream.generate(() -> ThreadLocalRandom.current().nextDouble(0.0, 10.0)) - 随机布尔值:
Stream.generate(() -> Math.random() > 0.5)或ThreadLocalRandom.current().nextBoolean() - 随机字符串(如 5 位字母):
Stream.generate(() -> RandomStringUtils.randomAlphabetic(5))(需 Apache Commons Lang)
实际使用时务必限制长度
无限流不能直接终端操作(如 collect()),否则会 OOM。必须配合中间操作截断:
-
stream.limit(1000)取前 1000 个 stream.takeWhile(x -> x (Java 9+)按条件截取-
stream.skip(100).limit(50)跳过前 100 个再取 50 个
封装成可复用的工具方法
例如定义一个静态工厂方法:
public static Stream<integer> randomIntStream(int min, int max) {
return Stream.generate(() -> ThreadLocalRandom.current().nextInt(min, max));
}</integer>
调用:randomIntStream(1, 101).limit(10).forEach(System.out::println);











