292. Java Stream API - 使用构建器模式创建 Stream

文章目录

  • [292. Java Stream API - 使用构建器模式创建 Stream](#292. Java Stream API - 使用构建器模式创建 Stream)
      • [🎯 核心概念](#🎯 核心概念)
      • [📌 示例:使用构建器模式创建流](#📌 示例:使用构建器模式创建流)
      • [📌 需要注意的事项:](#📌 需要注意的事项:)
      • [📌 适用场景](#📌 适用场景)
      • [🎯 小测验(课堂互动)](#🎯 小测验(课堂互动))
      • [📌 总结](#📌 总结)

292. Java Stream API - 使用构建器模式创建 Stream

🎯 核心概念

构建器模式(Builder Pattern 允许你通过分步构建的方式来创建流。这个模式非常适合在你预先知道一组元素并希望将它们聚合成流的场景下使用。你可以在构建器中逐个添加元素,然后通过 build() 方法创建流。

构建器模式的两个步骤:
  1. 添加元素 :你首先使用 Stream.builder() 创建一个构建器实例,并通过 add() 方法逐个添加元素。
  2. 创建流 :使用 builder.build() 创建流,一旦流创建完成,你不能再向构建器中添加元素,否则会抛出 IllegalStateException 异常。

📌 示例:使用构建器模式创建流

java 复制代码
Stream.Builder<String> builder = Stream.<String>builder();  // 创建一个构建器
builder.add("one")  // 添加元素
       .add("two")
       .add("three")
       .add("four");
Stream<String> stream = builder.build();  // 构建流

List<String> list = stream.toList();  // 将流收集到列表
System.out.println("list = " + list);  // 输出列表

🧾 输出结果:

java 复制代码
list = [one, two, three, four]

在这段代码中,我们使用了构建器模式逐步添加了四个字符串元素。最后,通过 builder.build() 创建了一个流。使用 stream.toList() 方法,我们将流中的元素收集到一个列表中并打印。


📌 需要注意的事项:

  1. 一旦构建流后,构建器就不可用 :你不能再次向已经构建的流中添加元素,也不能重用这个构建器去构建新的流。如果你尝试这么做,程序会抛出 IllegalStateException
  2. 构建器的顺序:你添加元素的顺序会被保留下来。流会按照你添加元素的顺序进行处理。
  3. 适用场景:当你需要从多个独立的元素创建流时,构建器模式特别有用。比如,元素可能是动态的,或者在不同的阶段逐步生成。

📌 适用场景

  • 动态构建流:当元素不确定或在运行时生成时,可以使用构建器模式。例如,收集用户输入的多项内容并将它们转化为流进行处理。
  • 延迟流的构建:你可以在运行时逐步添加数据,而不是立即创建一个包含所有元素的流,这对于内存管理和性能优化有时非常有帮助。

🎯 小测验(课堂互动)

问题: 下面的代码会发生什么错误?

java 复制代码
Stream.Builder<String> builder = Stream.<String>builder();
builder.add("one").add("two");
Stream<String> stream1 = builder.build();
Stream<String> stream2 = builder.build();  // 再次使用构建器创建流

✅ A. 编译错误

✅ B. IllegalStateException

正确答案: B


📌 总结

  • 构建器模式 是通过分步添加元素来创建流的一种便捷方式,尤其适用于你已经知道一组元素并且希望动态构建流的情况。
  • 一旦流创建完成,构建器就不再可用。你不能在流创建后再继续向其中添加元素。
  • 使用构建器模式可以让你的代码更加灵活,且适用于不同场景下的流构建需求。
相关推荐
计算机毕设定制辅导-无忧学长2 分钟前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
码路漫漫4 分钟前
LRU 真的能解决日志按业务 Key 分文件的落地瓶颈吗?
java·后端
带刺的坐椅24 分钟前
不只是 Token 流:Solon AI 4.1 的语义化聊天事件
java·stream·event·solon-ai
延凡科技29 分钟前
建筑节能新视角:智慧冷站的数字化实践
java·人工智能·能源·暖通
励志不掉头发的内向程序员33 分钟前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互
www_aiyuanma_vip1 小时前
Java个人博客系统
java·开发语言
leoZ2311 小时前
第 7 篇:进阶——校验、联动、列表页
开发语言·前端·javascript·vue.js·人工智能·目标检测·ecmascript
秋名RG1 小时前
Java 集合框架完全指南:从核心接口到 JDK 21 有序集合新特性
java·windows
luj_17681 小时前
虚实交融中的真实人物塑造
c语言·开发语言·网络·经验分享·算法
蜡台1 小时前
Kotlin 五大作用域函数详解|let/run/apply/also/with 选型指南+实战避坑
android·java·kotlin