DartのforEachメソッド

Flutter/Dart

この記事では、DartのforEachメソッドについて書いていきます。

forEachメソッドとは

ListやMapなどのコレクション(反復可能なデータ)の全要素に対して、順番に処理を1つずつ実行するメソッドです。

サンプル(List)

void main() {
  final fruits = ['バナナ', 'オレンジ', 'スイカ'];

  fruits.forEach((fruit) {
    print(fruit); // バナナ, オレンジ, スイカの順に出力
  });
}

サンプル(map)

void main() {
  final users = {'太郎':20, '二郎': 25};

  users.forEach((key, value) {
    print('$key is $value years old');
  });
}

mapとの違い

  • forEach: 「1要素ずつ取り出して、画面に表示する(print)」など、その場で処理を実行して終わりにしたい場合に使います(戻り値はありません)。​
  • map: 元のリストを加工して、新しいリストを作り出したい場合に使います。

for-in文との違い

  • break や continue が使えるか
  • 「インデックス(何番目か)」を扱えるか
  • 「非同期処理(async/await)」との相性

break や continue が使えるか

void main(){
final fruits = ['りんご', 'みかん', 'ばなな'];

// 【for文】「みかん」を見つけたらループを終了する
for (var fruit in fruits) {
  if (fruit == 'みかん') break; 
  print(fruit); // 「りんご」だけ出力される
}

// 【forEach】途中で止めることはできない
fruits.forEach((fruit) {
  if (fruit == 'みかん') return; // この回の処理をスキップするだけ(continueと同じ動き)
  print(fruit); // 「りんご」「ばなな」が出力される
});
}

「インデックス(何番目か)」を扱えるか

void main(){
final fruits = ['りんご', 'みかん', 'ばなな'];
// 【for文】何番目かも一緒にスマートに出力できる
for (var i = 0; i < fruits.length; i++) {
  print('$i番目: ${fruits[i]}');
}
  }

「非同期処理(async/await)」との相性

void main(){
final fruits = ['りんご', 'みかん', 'ばなな'];
// 【for文】1つずつ完了を待ちながらループしてくれる(正しい挙動)
for (var fruit in fruits) {
  await saveToDatabase(fruit); 
}
  }

どう使い分ければいいの?

​現代のDart(Flutter開発など)では、以下のような使い分けが一般的です。

使うものおすすめのシチュエーション特徴
for-in文 for (var x in list)基本はこれ! 途中で止めたり、非同期処理をしたり、一番万能で読みやすい。自由度:高 ★★★
通常の for文 for (var i = 0; …)インデックス番号(i)を使って何か処理したいとき。自由度:高 ★★★
forEachすべての要素に対して、単純な処理(print でのデバッグなど)を1行でスッキリ書きたいとき。自由度:低 ★☆☆

タイトルとURLをコピーしました