List data = [1, 2, 3];
data.forEach((value) {
if (value == 2) {
// how to stop?
}
print(value);
});
Я пробовал return false;
, который работает в jQuery, но он не работает в Dart.
Есть ли способ сделать это?
List data = [1, 2, 3];
data.forEach((value) {
if (value == 2) {
// how to stop?
}
print(value);
});
Я пробовал return false;
, который работает в jQuery, но он не работает в Dart.
Есть ли способ сделать это?
Вы также можете использовать for/in, который неявно использует итератор, точно продемонстрированный в другом ответе:
List data = [1,2,3];
for(final i in data){
print('$i');
if (i == 2){
break;
}
}
Также можно реализовать свой пример, используя forEach() и takeWhile().
var data = [1, 2, 3];
data.takeWhile((val) => val != 2).forEach(print);
Обратный вызов, который 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;
}
}
}
Разрыв 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);
Dart не поддерживает нелокальные возвращения, поэтому возврат из обратного вызова не приведет к поломке цикла. Причина, по которой он работает в jQuery, заключается в том, что каждый() проверяет значение, возвращаемое обратным вызовом. Dart forEach обратный вызов возвращает void.
основываясь на посте Грега Лоу, я использовал, где для моего проекта, а также он работает.
var data = [1, 2, 3];
data.where((val) => val != 2).forEach(print);