Dart Academy · 课时

转换流:map、where、take

重塑事件序列

第 3 / 4 课13 个步骤

转换流: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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 await for 监听
  2. 单订阅流与广播流
  3. 转换流:map、where、take
  4. 使用 async* 创建流
← 返回 Dart Academy