List data = [1, 2, 3];
data.forEach((value) {
if (value == 2) {
// how to stop?
}
print(value);
});
我尝试使用jQuery中的return false;
,但它在Dart中不起作用。
有办法吗?
答案 0 :(得分:31)
你也可以使用for / in,它隐含地使用在另一个答案中恰当地展示的迭代器:
List data = [1,2,3];
for(final i in data){
print('$i');
if (i == 2){
break;
}
}
答案 1 :(得分:20)
也可以使用forEach()和takeWhile()实现您的示例。
var data = [1, 2, 3];
data.takeWhile((val) => val != 2).forEach(print);
答案 2 :(得分:10)
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;
}
}
}
答案 3 :(得分:9)
打破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时,Map不一定具有键。如果您只想要这些值,请执行example.values
而不是example.keys
。
或者,如果您只搜索元素,则可以将所有内容简化为:
List<int> example = [ 1, 2, 3 ];
int matched = example.firstMatching((e) => e == 2, orElse: () => null);
答案 4 :(得分:2)
Dart不支持非本地返回,因此从回调中返回不会打破循环。 它在jQuery中工作的原因是each()检查回调返回的值。 Dart forEach回调返回void。
答案 5 :(得分:1)
根据Greg Lowe的帖子,我在项目中使用了位置,并且也可以正常工作。
var data = [1, 2, 3];
data.where((val) => val != 2).forEach(print);
答案 6 :(得分:0)
使用多循环
中断外循环
OUTER: for (var i = 0; i < m.length; i++) {
for (var j = 0; j < m[i].length; j++) {
if (m[i][j] < 0) {
print("Negative value found at $i,$j: ${m[i][j]}");
break OUTER;
}
}
}
继续外循环
outer: for (var v in a) {
for (var w in b) {
if (w == v) continue outer;
}
print(v);
}
答案 7 :(得分:0)
这里是 for-in 循环的完整示例,接近于 forEach 样式。
void main(){
var myList = [12, 18, 24, 63, 84,99];
myList.forEach((element) {
print(element);
if (element ==24); //break; // does not work
});
for(var element in myList) {
print(element);
if (element==24) break;
}
}
答案 8 :(得分:0)
您可以使用for
和indexOf
for (var number in id) {
var index = id.indexOf(number);
print('Origin forEach loop');
for (int i = 0; i < 1; i++) {
print("for loop");
}
break;
}
答案 9 :(得分:0)
有人建议使用 where()
,但它不是具有中断功能的 forEach()
的一般替代品
(然而,where
是问题示例中所示用例的正确替代品。另一方面,我将重点放在标题中的问题上)
foreach()
的功能与 break
等价,由 any()
给出:继续循环返回 false,停止返回真的; any() 的结果可以忽略。我认为它更类似于 jquery 中的 each()
(但在 dart 中阻止你返回 true)。
为了有一个带有索引的循环,以及在中断循环的情况下的可能性,我使用以下扩展名:
extension IterableUtils<E> on Iterable<E> {
/**
Similar to Iterable.forEach() but:
- with an index argument
- with the optional capacity to break the loop, returning false
Note: as for the return clause, you can omit it, as with forEach()
*/
void forEachIndexed(Function(E element, int index) f) {
int index = 0;
for (E element in this) {
if (f(element, index) == false) break;
index++;
}
}
}
void main() {
List list = ["a", "b", "c"];
list.forEachIndexed((element, index) {
print("$index: $element");
//Optional:
if (element == "b") return false; //break
});
}
答案 10 :(得分:0)
你可以从 forEach 中清空 return 来打破循环;
List<int> data = [1, 2, 3];
int _valueToBePrinted;
data.forEach((value) {
if (value == 2) {
_valueToBePrinted = value;
return;
}
});
// you can return something here to
// return _valueToBePrinted;
print(value);
无论如何你不应该......
问题是,你不能在整个 forEach 循环中返回任何东西
//This don't work
data.forEach((value) {
if (value == 2) {
_valueToBePrinted = value;
return;
}
if (value == 1) {
return value;
}
});