Dart:手动迭代

  1. 基本概念
  2. 基本流程
  3. 示例运行
  4. 为什么要用这种方式

基本概念

在 Dart 里:

  • Iterable:可以被遍历的集合(List、Set、生成器 sync* 返回值等)
  • Iterator:负责一次一次取出元素的工具对象
Iterable   →   iterator   →   moveNext() & current
  • Iterable.iterator 会返回一个 迭代器对象(Iterator<T>
  • 迭代器内部维护一个当前位置(刚开始在第一个元素前面)
  • 通过 moveNext() 移动到下一个元素,并返回是否还有元素
  • 通过 current 读取当前元素

基本流程

获取迭代器:迭代器的位置现在还在第一个元素之前。

var it = someIterable.iterator;

移动到下一个元素

bool hasMore = it.moveNext();
  • 如果有下一个元素 → 返回 true,位置指向该元素
  • 如果没有 → 返回 false(到头了)

获取当前元素:

var value = it.current;
  • current 只是取当前位置的值
  • 如果不先 moveNext()current 的值是无效的

示例运行

void main() {
  // numbers 是一个 List<int>,属于 Iterable<int>
  // Iterable 是一个可以被迭代的集合类型
  // 它可以是 List、Set 等类型
  var numbers = [10, 20, 30];
  // 使用迭代器来遍历 Iterable
  // numbers.iterator 返回一个迭代器
  // 迭代器是一个对象,它可以逐个访问集合中的元素
  var it = numbers.iterator;

  // moveNext() 方法会移动到下一个元素
  // 如果有下一个元素,返回 true;如果没有下一个元素,返回 false
  while (it.moveNext()) {
    // current 属性返回当前元素
    // 注意:在调用 moveNext() 之前,current 是无效的
    // 所以必须先调用 moveNext(),然后才能访问 current
    // 这里的 it.current 是迭代器的当前元素
    print('当前元素: ${it.current}');
  }
}

运行过程:

1️⃣ moveNext() → true,current = 10
2️⃣ moveNext() → true,current = 20
3️⃣ moveNext() → true,current = 30
4️⃣ moveNext() → false,循环结束

输出:

当前元素: 10
当前元素: 20
当前元素: 30

为什么要用这种方式

更精细控制:可以中途暂停、跳过元素、倒退(配合自定义迭代器)

for-in 循环的底层机制for (var x in iterable) 就是自动帮你调用 iterator.moveNext()iterator.current

适合需要“边迭代边做复杂控制”的场景


var it = data.iterator;
while (it.moveNext()) {
  if (it.current < 0) break; // 提前结束
  print(it.current);
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com

×

喜欢就点赞,疼爱就打赏