转换流:map、where、take
重塑事件序列
转换流:map、where、take 是 CoddyKit 上的免费 Dart Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Dart Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Dart Academy 课程共包含 4 节课。
流可以转换
与列表一样,流也提供了许多实用方法来重新组织事件。您可以将流转换为一个新流,而不修改源流。
map 转换每个事件
map方法会对每个事件执行一个函数,并发出处理结果。它会将一个值流转换为一个经过转换的值流。
final doubled = numbers.map((n) => n * 2);map 保持数量不变
使用map时,事件数量保持不变,只有它们的形式发生变化。三个输入始终会准确地产生三个输出。✨
Stream.fromIterable([1, 2, 3])
.map((n) => 'Item $n');where 筛选事件
where方法只保留通过测试的事件。任何返回 false 的事件都会从新流中移除。
final evens = numbers.where((n) => n.isEven);where 可以缩小流
与 map 不同,where发出的事件可能少于接收到的事件。如果没有任何事件通过测试,生成的流就会保持为空。
take 限制数量
take方法只发出前 n 个事件,然后停止监听。当您只需要从长流中取得少量值时,它非常实用。🎯
final firstThree = bigStream.take(3);take 会提前取消
发出 n 个事件后,take会自动取消对源流的订阅。原始流也会停止为您产生事件。
串联转换
这些方法会返回新流,因此您可以将它们串联起来。请从左到右阅读这条链:先筛选,再转换,最后限制数量。
numbers
.where((n) => n.isEven)
.map((n) => n * 10)
.take(2);天生惰性执行
转换操作是惰性的:在您开始监听之前,什么都不会执行。这条链只会随着事件到达逐个处理事件。
更多工具:takeWhile 和 skip
除了三个核心方法外,takeWhile会持续发出事件,直到测试失败;skip 会忽略前 n 个事件。它们同样可以采用串联方式。
stream.skip(2).takeWhile((n) => n < 100);使用转换结果
完成转换后,请使用等待遍历或监听来读取新流。每个发出的值都已经经过了整条转换链。
await for (final v in transformed) {
print(v);
}快速检查
哪个方法可以减少事件数量?
回顾
您可以使用map转换流、使用 where 筛选流、使用 take 限制数量;这些方法都可以串联,并且在开始监听前都以惰性方式执行。🎉
用 AI 导师学习 Dart — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「转换流:map、where、take」课时是免费的吗?
是的 — 「转换流:map、where、take」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Dart Academy 课程的其余内容,请升级到 CoddyKit PRO。 Dart Academy 课程共包含 4 节课。
「转换流:map、where、take」这节课中我会学到什么?
重塑事件序列 你通过在浏览器中直接运行的动手代码来练习 Dart Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Dart Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Dart Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「转换流:map、where、take」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Dart Academy 课中编写并运行代码吗?
能。每节 Dart Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 await for 监听
- 单订阅流与广播流
- 转换流:map、where、take
- 使用 async* 创建流