如何阻止Dart的.forEach()?

时间:2012-09-25 16:15:46

标签: dart

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

我尝试使用jQuery中的return false;,但它在Dart中不起作用。 有办法吗?

11 个答案:

答案 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。

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

答案 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)

您可以使用forindexOf

 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;
  }
});