dart系列之:在dart中使用生成器
2023-03-15 22:07:30 时间
简介
ES6中在引入异步编程的同时,也引入了Generators,通过yield关键词来生成对应的数据。同样的dart也有yield关键词和生成器的概念。
什么时候生成器呢?所谓生成器就是一个能够持续产生某些数据的装置,也叫做generator。
两种返回类型的generator
根据是同步生成还是异步生成,dart返回的结果也是不同的。
如果是同步返回,那么返回的是一个Iterable对象.
如果是异步返回,那么返回的是一个Stream对象。
同步的generator使用sync*关键词如下:
Iterable<int> naturalsTo(int n) sync* {
int k = 0;
while (k < n) yield k++;
}
异步的generator使用的是async* 关键词如下:
Stream<int> asynchronousNaturalsTo(int n) async* {
int k = 0;
while (k < n) yield k++;
}
生成关键词使用的是yield。
如果yield后面跟着的本身就是一个generator,那么需要使用yield*。
Iterable<int> naturalsDownFrom(int n) sync* {
if (n > 0) {
yield n;
yield* naturalsDownFrom(n - 1);
}
}
Stream的操作
stream表示的是流,得到这个流之后,我们需要从流中取出对应的数据。
从Stream中取出数据有两种方式,第一种就是使用Stream本身的API来获取Stream中的数据。
最简单的就是调用stream的listen方法:
StreamSubscription<T> listen(void onData(T event)?,
{Function? onError, void onDone()?, bool? cancelOnError});
listen可以接数据的处理方法,具体使用如下:
final startingDir = Directory(searchPath);
startingDir.list().listen((entity) {
if (entity is File) {
searchFile(entity, searchTerms);
}
});
默认的方法是onData方法。
另外一种就是今天要讲解的await for.
await for的语法如下:
await for (varOrType identifier in expression) {
// Executes each time the stream emits a value.
}
要注意的是上面的expression必须是一个Stream对象。并且await for必须用在async中,如下:
Future<void> main() async {
// ...
await for (final request in requestServer) {
handleRequest(request);
}
// ...
}
如果要想中断对stream的监听,则可以使用break或者return。
总结
以上就是dart中生成器的使用了。
本文已收录于 http://www.flydean.com/13-dart-generators/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
相关文章
- fdupes:Linux 中查找并删除重复文件的命令行工具
- 如何在 Linux 中恢复一个删除了的文件
- Apache Storm 官方文档 —— 常用模式
- 四重奏筛保理算法和波拉德 Rho 保理算法的实证比较
- 集装箱的安全名称速度内核审核
- 通用私人估算器
- VOSYSmonitoRV:在具有 Linux 功能的 RISC-V 平台上的混合临界解决方案
- WaveFake: 一组数据,以促进音频深做检测
- 全面通透深入剖析工厂方法模式
- 【新功能!】Anycast CLB 如何支持多地&动态加速的负载均衡服务,高速互联转发!
- Transformer可以不需要Softmax?Kakao提出了UFO-ViT,性能高,计算量还小
- 用NginScript做个带权限的文件分发服务
- [1067]CDH6.3.2之Kerberos安全认证
- [1065]impala查询内存限制Memory limit exceeded
- 基于ARM嵌入式实时流媒体服务开发及部署,EasyGBS支持ARM64架构
- 【双12.12最后1天】企业专区 更新了一批"让利硬货"!4\8\16核,高带宽!整起来!
- 企业网站如何建设速度最快?企业网站如何建设最省钱?
- 16.彻底解决Jmap在mac版本无法使用的问题
- Knative 如何释放无服务器的力量
- vscode 配置默认shell 使用 git-bash; vscode 默认文件保存,配合git使用,完美兼容linux编程环境