生成器

PPG007 ... 2022-3-14 Less than 1 minute

# 生成器

当你需要延迟地生成一连串的值时,可以考虑使用 生成器函数。Dart 内置支持两种形式的生成器方法:

  • 同步生成器:返回一个 Iterable 对象。
  • 异步生成器:返回一个 Stream 对象。

通过在函数上加 sync* 关键字并将返回值类型设置为 Iterable 来实现一个 同步 生成器函数,在函数中使用 yield 语句来传递值:

Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) {
    yield k++;
  }
}

void main(List<String> args) {
  var x = naturalsTo(10).iterator;
  while (x.moveNext()) {
    print(x.current);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

实现 异步 生成器函数与同步类似,只不过关键字为 async* 并且返回值为 Stream:

Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) {
    yield k++;
  }
}

void main(List<String> args) async {
  var numbers = asynchronousNaturalsTo(10);
  await for (var x in numbers) {
    print(x);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

如果生成器是递归调用的,可是使用 yield* 语句提升执行性能:

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}

void main(List<String> args) {
  var x = naturalsDownFrom(10).iterator;
  while (x.moveNext()) {
    print(x.current);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
Last update: March 14, 2022 11:48
Contributors: PPG007