285. Java Stream API - 通过 Supplier 创建 Stream

文章目录

  • [285. Java Stream API - 通过 Supplier 创建 Stream](#285. Java Stream API - 通过 Supplier 创建 Stream)
      • [✅ 基本概念](#✅ 基本概念)
      • [🧪 示例代码](#🧪 示例代码)
        • [💻 输出结果:](#💻 输出结果:)
      • [⚠️ 小心!这是个无限流!](#⚠️ 小心!这是个无限流!)
      • [🎯 正确使用方式:结合 **限制操作(short-circuiting)**](#🎯 正确使用方式:结合 限制操作(short-circuiting))
      • [🧠 学习要点](#🧠 学习要点)
      • [📌 示例:生成时间戳](#📌 示例:生成时间戳)
      • [🧪 小练习题(可做培训互动)](#🧪 小练习题(可做培训互动))
      • [📚 小结](#📚 小结)

285. Java Stream API - 通过 Supplier 创建 Stream


✅ 基本概念

JavaStream 接口提供了两个用于从 Supplier(供应者) 创建流的工厂方法,其中之一就是:

java 复制代码
Stream.generate(Supplier<T> supplier)

这个方法用于 生成无限流(infinite stream) :每当流需要一个新元素时,Supplier 就会被调用一次来"供应"这个元素。


🧪 示例代码

java 复制代码
Stream<String> generated = Stream.generate(() -> "+");
List<String> strings = generated.limit(5L).toList();
System.out.println("strings = " + strings);
💻 输出结果:
java 复制代码
strings = [+, +, +, +, +]

⚠️ 小心!这是个无限流!

❗ 如果你去掉 .limit(5L),这个程序将永远不会停止运行!

java 复制代码
Stream<String> generated = Stream.generate(() -> "+");
generated.forEach(System.out::println); // ❌ 小心,死循环

🚨 它将不停地生成 +,直到你的内存耗尽,甚至抛出 OutOfMemoryError


🎯 正确使用方式:结合 限制操作(short-circuiting)

Stream API 中,像 limit() 这样的操作被称为 短路操作(short-circuiting operations)。它的作用是"提前终止流的生成或处理"。

✅ 加上 limit(n),我们就可以从无限流中"截取"前 n 个元素使用。

java 复制代码
Stream<Double> randoms = Stream.generate(Math::random);
List<Double> topFive = randoms.limit(5).toList();
System.out.println(topFive); // 打印 5 个随机数

🧠 学习要点

关键点 说明
Stream.generate(...) 会创建一个 无限 的流
必须 使用 limit() 或其他短路操作 否则程序会永远运行或耗尽资源
适合生成固定模式、常量、随机数等 比如 "++++++++" 或随机数序列
每次调用都会重新获取一个值 这与 of(...)Arrays.stream(...)静态集合 不同

📌 示例:生成时间戳

java 复制代码
Stream<String> timeStream = Stream.generate(() -> Instant.now().toString());
List<String> timestamps = timeStream.limit(3).toList();
System.out.println(timestamps);

输出三个不同时间戳,适合用于日志采样、延迟任务等场景。


🧪 小练习题(可做培训互动)

问:以下代码会输出几个 "Hello"

java 复制代码
Stream.generate(() -> "Hello")
      .limit(3)
      .forEach(System.out::println);

答案:

java 复制代码
Hello
Hello
Hello

📚 小结

  • Stream.generate(...) = 无限供应机,每次都生产一个元素。
  • 不加限制操作就是"失控的水龙头 💦",必须加上 .limit().takeWhile() 等手段节流。
  • 适合用于生成常量、重复元素、随机值、当前时间等"动态"数据。
相关推荐
y1233447788993 分钟前
国密算法SM2实现(Openssl)
开发语言·openssl·国密
爱上妖精的尾巴5 分钟前
7-16 WPS JS宏 RandBetween、Address实例8--[唯一性]类的应用
开发语言·javascript·wps·js宏·jsa
从此不归路6 分钟前
Qt5 进阶【10】应用架构与插件化设计实战:从「单体窗口」走向「可扩展框架」
开发语言·c++·qt·架构
hexionly7 分钟前
演示工厂模式和策略模式的基本用法
java·简单工厂模式·策略模式·开闭原则
sjjhd6529 分钟前
C++模拟器开发实践
开发语言·c++·算法
shehuiyuelaiyuehao10 分钟前
javaSE大总结
java
曹天骄10 分钟前
Cloudflare CDN 预热全面实战指南(含全球 PoP 解析 + 预热覆盖模型)
运维·开发语言·缓存
Paraverse_徐志斌13 分钟前
针对 SAAS 私有化部署,如何优雅合并微服务
java·微服务·架构·saas·私有化
csbysj202013 分钟前
传输对象模式(Object Transfer Pattern)
开发语言
步达硬件15 分钟前
【Matlab】把视频里每一帧存为单独的图片
开发语言·matlab·音视频