内容

循环

此页面展示了如何使用循环和支持语句来控制 Dart 代码的流程。

  • for 循环
  • whiledo while 循环
  • breakcontinue

您也可以使用 Dart 来操作控制流

  • 分支,例如 ifswitch
  • 异常,例如 trycatchthrow

for 循环

#

您可以使用标准的 for 循环进行迭代。例如

dart
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}

Dart 的 for 循环内部的闭包捕获索引的。这避免了在 JavaScript 中常见的陷阱。例如,考虑

dart
var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}

for (final c in callbacks) {
  c();
}

输出如预期的那样是 0 然后是 1。相比之下,在 JavaScript 中,示例将打印 2 然后是 2

有时您在迭代 Iterable 类型(如 ListSet)时可能不需要知道当前的迭代计数器。在这种情况下,使用 for-in 循环可以使代码更简洁

dart
for (final candidate in candidates) {
  candidate.interview();
}

要处理从可迭代对象中获得的值,您也可以在 for-in 循环中使用 模式

dart
for (final Candidate(:name, :yearsExperience) in candidates) {
  print('$name has $yearsExperience of experience.');
}

可迭代类还具有 forEach() 方法作为另一种选择

dart
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3

while 和 do-while

#

while 循环在循环之前评估条件

dart
while (!isDone()) {
  doSomething();
}

do-while 循环在循环之后评估条件

dart
do {
  printLine();
} while (!atEndOfPage());

break 和 continue

#

使用 break 停止循环

dart
while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

使用 continue 跳到下一个循环迭代

dart
for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

如果您使用的是 Iterable(例如列表或集合),您编写上一个示例的方式可能有所不同

dart
candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());