Как остановить Dart.forEach()? - программирование
Подтвердить что ты не робот

Как остановить Dart.forEach()?

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

Я пробовал return false;, который работает в jQuery, но он не работает в Dart. Есть ли способ сделать это?

4b9b3361

Ответ 1

Вы также можете использовать for/in, который неявно использует итератор, точно продемонстрированный в другом ответе:

List data = [1,2,3];

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

Ответ 2

Также можно реализовать свой пример, используя forEach() и takeWhile().

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

Ответ 3

Обратный вызов, который 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;
    }
  }
}

Ответ 4

Разрыв List

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

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

Нарушение Map

Если вы имеете дело с 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;
  }
}

Обратите внимание, что карта не обязательно имеет эти ключи, поскольку [ 'A', 'B', 'C' ] использует LinkedHashMap, если вы этого хотите. Если вам просто нужны значения, просто example.values вместо example.keys.

В качестве альтернативы, если вы ищете только элемент, вы можете упростить все:

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

Ответ 5

Dart не поддерживает нелокальные возвращения, поэтому возврат из обратного вызова не приведет к поломке цикла. Причина, по которой он работает в jQuery, заключается в том, что каждый() проверяет значение, возвращаемое обратным вызовом. Dart forEach обратный вызов возвращает void.

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

Ответ 6

основываясь на посте Грега Лоу, я использовал, где для моего проекта, а также он работает.

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