如何阻止Dart的.forEach()?

Lek*_*sat 37 dart

List data = [1, 2, 3];
data.forEach((value) {
  if (value == 2) {
    // how to stop?
  }
  print(value);
});
Run Code Online (Sandbox Code Playgroud)

我尝试过return false;在jQuery中运行,但它在Dart中不起作用.有办法吗?

Joh*_*ans 46

你也可以使用for/in,它隐含地使用在另一个答案中恰当地演示的迭代器:

List data = [1,2,3];

for(final i in data){
  print('$i');
  if (i == 2){
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 下面的“takeWhile()”解决方案利用了 Dart 的最新更改,对于大多数情况来说可能是更好的解决方案。 (2认同)

Gre*_*owe 25

也可以使用forEach()和takeWhile()来实现您的示例.

var data = [1, 2, 3];
data.takeWhile((val) => val != 2).forEach(print);
Run Code Online (Sandbox Code Playgroud)

  • 当我发布原始答案时, .takeWhile() 不在。我想说,对于大多数情况,它现在是一种更合适、更优雅的方法。 (4认同)

Cut*_*tch 13

forEach采用的回调返回void,因此没有停止迭代的机制.

在这种情况下,您应该使用迭代器:

void listIteration() {
  List data = [1,2,3];

  Iterator i = data.iterator();

  while (i.hasNext()) {
    var e = i.next();
    print('$e');
    if (e == 2) {
      break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


src*_*der 13

打破一个 List

List<int> example = [ 1, 2, 3 ];

for (int value in example) {
  if (value == 2) {
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

打破一个 Map

如果你正在处理a,Map你不能简单地从给定的地图中获得一个迭代器,但你仍然可以for通过将它应用于值或键来使用它.由于您有时可能需要键和值的组合,这是一个示例:

Map<String, int> example = { 'A': 1, 'B': 2, 'C': 3 };

for (String key in example.keys) {
  if (example[key] == 2 && key == 'B') {
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,[ 'A', 'B', 'C' ]如果您需要,Map不一定具有使用LinkedHashMap的键.如果你只是想的价值观,只是做example.values代替example.keys.

或者,如果您只搜索元素,则可以将所有内容简化为:

List<int> example = [ 1, 2, 3 ];
int matched = example.firstMatching((e) => e == 2, orElse: () => null);
Run Code Online (Sandbox Code Playgroud)


Les*_*iak 5

Dart 不支持非本地返回,因此从回调返回不会破坏循环。它在 jQuery 中工作的原因是 each() 检查回调返回的值。Dart forEach 回调返回 void。

http://docs.jquery.com/Core/each