この記事では、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行でスッキリ書きたいとき。 | 自由度:低 ★☆☆ |

