web-dev-qa-db-fra.com

Comment arrêter le .forEach () de Dart?

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

J'ai essayé return false; qui fonctionne dans jQuery, mais ne fonctionne pas dans Dart. Y a-t-il un moyen de le faire?

44
Leksat

Vous pouvez également utiliser un for/in, qui utilise implicitement l'itérateur correctement démontré dans l'autre réponse:

List data = [1,2,3];

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

Il est également possible d'implémenter votre exemple en utilisant forEach () et takeWhile ().

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

Le rappel que prend forEach renvoie void donc il n'y a pas de mécanisme pour arrêter l'itération.

Dans ce cas, vous devez utiliser des itérateurs:

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

  Iterator i = data.iterator();

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

Briser un List

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

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

Briser un Map

Si vous avez affaire à un Map, vous ne pouvez pas simplement obtenir un itérateur de la carte donnée, mais vous pouvez toujours utiliser un for en l'appliquant aux valeurs ou aux clés. Comme vous pouvez parfois avoir besoin de la combinaison de clés et de valeurs, voici un exemple:

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

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

Notez qu'une carte n'a pas nécessairement ses clés comme [ 'A', 'B', 'C' ] utilisez un LinkedHashMap si vous le souhaitez. Si vous voulez juste les valeurs, faites simplement example.values au lieu de example.keys.

Alternativement, si vous recherchez uniquement un élément, vous pouvez tout simplifier pour:

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

Dart ne prend pas en charge les retours non locaux, donc le retour d'un rappel ne rompra pas la boucle. La raison pour laquelle cela fonctionne dans jQuery est que each () vérifie la valeur retournée par le rappel. Dart forEach callback renvoie vide.

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

4
Lesiak

basé sur le post de Greg Lowe, j'ai utilisé où pour mon projet et ça marche aussi.

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