Dart 语言 生成器与迭代器模式实现

Dart阿木 发布于 2025-06-18 8 次阅读


摘要:

在 Dart 语言中,生成器与迭代器模式是处理数据流和序列的重要工具。生成器允许我们创建一个可以暂停和恢复执行的函数,而迭代器模式则提供了一种统一的方式来遍历集合。本文将深入探讨 Dart 中的生成器与迭代器模式,并通过实际代码示例展示如何实现这些模式。

一、

在编程中,我们经常需要处理数据流和序列,例如遍历列表、文件读取、网络请求等。Dart 语言提供了生成器与迭代器模式,使得我们可以以更高效、更简洁的方式处理这些任务。本文将详细介绍 Dart 中的生成器与迭代器模式,并通过示例代码展示如何实现。

二、生成器

生成器是 Dart 中的一种特殊函数,它允许我们创建一个可以暂停和恢复执行的函数。生成器函数使用 `yield` 关键字来返回值,并在每次调用时从上次暂停的位置继续执行。

1. 生成器函数的基本语法

dart

int countDown(int start) sync {


for (int i = start; i > 0; i--) {


yield i;


print('Counting down: $i');


}


}


2. 使用生成器函数

dart

void main() {


var countdown = countDown(5);


while (true) {


var result = countdown.next();


if (result.done) break;


print(result.value);


}


}


三、迭代器模式

迭代器模式提供了一种统一的方式来遍历集合,而不必关心集合的具体实现。在 Dart 中,迭代器是通过实现 `Iterable` 接口来实现的。

1. 实现迭代器

dart

class CountdownIterable implements Iterable<int> {


final int start;

CountdownIterable(this.start);

@override


Iterator<int> get iterator => CountdownIterator(start);


}

class CountdownIterator implements Iterator<int> {


int _current;


final int _start;

CountdownIterator(this._start) : _current = _start;

@override


bool moveNext() {


if (_current > 0) {


_current--;


return true;


}


return false;


}

@override


int get current => _current;


}


2. 使用迭代器

dart

void main() {


var countdownIterable = CountdownIterable(5);


for (var i in countdownIterable) {


print(i);


}


}


四、生成器与迭代器的结合

在实际应用中,我们经常需要将生成器与迭代器模式结合起来使用。以下是一个结合使用生成器和迭代器的示例:

dart

Stream<int> countDownStream(int start) async {


for (int i = start; i > 0; i--) {


await Future.delayed(Duration(seconds: 1));


yield i;


print('Counting down: $i');


}


}

void main() async {


var countdownStream = countDownStream(5);


await for (var i in countdownStream) {


print(i);


}


}


在这个示例中,我们创建了一个异步生成器函数 `countDownStream`,它使用 `yield` 关键字返回值,并通过 `await Future.delayed` 模拟异步操作。在 `main` 函数中,我们使用 `await for` 循环来遍历生成器返回的值。

五、总结

生成器与迭代器模式是 Dart 语言中处理数据流和序列的重要工具。通过使用生成器,我们可以创建可暂停和恢复执行的函数,而迭代器模式则提供了一种统一的方式来遍历集合。本文通过示例代码展示了如何在 Dart 中实现生成器和迭代器模式,并探讨了它们在实际应用中的结合使用。

通过深入理解并掌握这些模式,我们可以编写出更加高效、可读性更强的 Dart 代码。