web-dev-qa-db-ja.com

Dartの.forEach()を停止する方法は?

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

私は試した return false;はjQueryでは機​​能しますが、Dartでは機能しません。それを行う方法はありますか?

44
Leksat

他の回答で適切に示されたイテレータを暗黙的に使用するfor/inを使用することもできます。

List data = [1,2,3];

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

ForEach()およびtakeWhile()を使用してサンプルを実装することもできます。

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

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;
    }
  }
}
15
Cutch

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);
14
srcspider

Dartはローカル以外のリターンをサポートしていないため、コールバックからリターンしてもループは解消されません。 jQueryで機能するのは、each()がコールバックによって返された値をチェックするためです。 Dart forEachコールバックはvoidを返します。

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

4
Lesiak

greg Loweの投稿に基づいて、私は自分のプロジェクトのどこを使用し、それも機能しました。

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