generator 迭代器协议的核心价值在于将「状态可控的按需计算」变为语言原生基础设施,自动满足 iterable 和 iterator 双协议,天然支持惰性求值、异步迭代与双向控制流。

Generator 迭代器协议的底层价值,不在于它多“炫技”,而在于它把「状态可控的按需计算」变成了语言原生支持的基础设施——不是靠模拟、不是靠库封装,而是由引擎直接保障的一致契约。
它让“可遍历”这件事彻底解耦
以往想让自定义对象被 for...of 遍历,得手动实现 Symbol.iterator + next() + value/done 三件套,稍有疏漏(比如多次调用返回同一个迭代器)就会出错。Generator 函数一写,自动满足 Iterable + Iterator 双协议:返回的对象自带 [Symbol.iterator]()(且每次调用都返回新迭代器),也自带 next() 方法,返回标准 {value, done}。这意味着你只需专注“产出逻辑”,不用操心协议胶水代码。
它把“惰性求值”从模式变成默认行为
数组 .map() 会立刻算出全部结果;而 generator 每次 next() 才执行到下一个 yield。这种天然惰性,让以下场景变得轻量自然:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 无限序列(如斐波那契、时间戳流)——不会爆内存
- 大数据分页拉取 —— yield 一页数据,等下次 next() 再请求下一页
- 配置驱动的状态机 —— 每个 yield 对应一个步骤,外部用 next() 推进,不依赖全局状态或回调嵌套
它为异步迭代提供统一语义底座
async function* 是 Generator 协议的自然延伸:next() 返回 Promise,await 解析后仍产出 {value, done}。这使得 同步和异步的数据流消费可以共用同一套接口。for await...of 能无缝处理文件流、WebSocket 消息、数据库游标——背后都是同一个迭代器协议在工作,只是 next() 的返回值从同步对象升级为 Promise。
它让控制流真正可组合、可中断
yield 不仅是暂停点,还是双向通信通道:next(arg) 的 arg 会成为上一个 yield 表达式的值;throw() 可向内部注入错误;return() 可提前终止并清理资源。这些能力被 co 库、Koa 中间件、甚至早期的 async/await 实现所复用——它们不是在造轮子,而是在迭代器协议之上做语义包装。协议本身提供了暂停/恢复/传参/报错/终止这五种基础控制权移交方式,所有高级封装都建立在此之上。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










