当需要延迟生成值序列时,请考虑使用生成器函数。 Dart具有对两种生成器功能的内置支持:
- 同步生成器: 返回一个 Iterable 对象
- 异步生成器: 返回一个 Stream 对象
要实现同步生成器函数,请将函数主体标记为sync*,并使用yield语句传递值:
Iterable<int> naturalsTo(int n) sync* {
int k = 0;
while (k < n) yield k++;
}
要实现异步生成器函数,请将函数主体标记为async*,并使用yield语句传递值:
Stream<int> asynchronousNaturalsTo(int n) async* {
int k = 0;
while (k < n) yield k++;
}
如果生成器是递归的,则可以使用yield*来提高其性能:
Iterable<int> naturalsDownFrom(int n) sync* {
if (n > 0) {
yield n;
yield* naturalsDownFrom(n - 1);
}
}