How to stop Dart's .forEach()?

2019-03-17 09:41发布

问题:

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

I tried return false; which works in jQuery, but it does not work in Dart. Is there a way to do it?

回答1:

You can also use a for/in, which implicitly uses the iterator aptly demonstrated in the other answer:

List data = [1,2,3];

for(final i in data){
  print('$i');
  if (i == 2){
    break;
  }
}


回答2:

It is also possible to implement your example using forEach() and takeWhile().

var data = [1, 2, 3];
data.takeWhile((val) => val != 2).forEach(print);


回答3:

The callback that forEach takes returns void so there is no mechanism to stop iteration.

In this case you should be using iterators:

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

  Iterator i = data.iterator();

  while (i.hasNext()) {
    var e = i.next();
    print('$e');
    if (e == 2) {
      break;
    }
  }
}


回答4:

Breaking a List

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

for (int value in example) {
  if (value == 2) {
    break;
  }
}

Breaking a Map

If you're dealing with a Map you can't simply get an iterator from the given map, but you can still use a for by applying it to either the values or the keys. Since you sometimes might need the combination of both keys and values, here's an example:

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

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

Note that a Map doesn't necessarily have they keys as [ 'A', 'B', 'C' ] use a LinkedHashMap if you want that. If you just want the values, just do example.values instead of example.keys.

Alternatively if you're only searching for an element, you can simplify everything to:

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


回答5:

Dart does not support non-local returns, so returning from a callback won't break the loop. The reason it works in jQuery is that each() checks the value returned by the callback. Dart forEach callback returns void.

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



标签: dart