この記事では、Dartのfor-in文について書いていきます。
サンプル
var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
void main(){
for (final object in flybyObjects) {
print(object);
}
}書き方
for(リスト要素の型 変数名 in リスト){
// 繰り返す処理
}よく使うプロパティ
isEmpty / isNotEmpty(空かどうかの判定)
「データが存在するときだけfor文を実行する」という安全策(ガード節)としてよく使われます。
void main(){
var users = ['Alice', 'Bob'];
if (users.isNotEmpty) {
for (var user in users) {
print(user);
}
}
}reversed(逆順)
要素を後ろから順番に処理したい場合に便利です。
void main(){
var original = [1, 2, 3];
// 3, 2, 1 の順で処理される
for (var num in original.reversed) {
print(num);
}
}インデックス(添字)も一緒に使いたい時
Dartのシンプルなfor-in文(for (var item in list))はインデックスが取れません。インデックスも同時に使いたい場合は、以下の方法(プロパティ・メソッド)をよく使います。
asMap()
Listを「インデックス(キー)と要素(値)」のMapに変換するプロパティです。これを使うと、for-inで両方を取り出せます。
void main(){
var fruits = ['リンゴ', 'バナナ', 'ミカン'];
for (var entry in fruits.asMap().entries) {
print('${entry.key}番目は ${entry.value}');
}
// 出力: 0番目は リンゴ, 1番目は バナナ...
}indexed (Dart 3.0以降でおすすめ!)
Dart 3.0で追加された、今一番スマートな方法です。レコード(Record)を使って、インデックスと要素を同時に分解(デストラクト)しながらループ処理ができます。
void main(){
var fruits = ['リンゴ', 'バナナ', 'ミカン'];
for (var (index, fruit) in fruits.indexed) {
print('$index: $fruit');
}
}Map(連想配列)をfor文で回すときのプロパティ
Mapをfor文で処理する場合は、どの部分をループさせたいかによってプロパティを使い分けます。
| プロパティ | 用途 |
|---|---|
| keys | キー(Key)だけを順番に処理する |
| values | 値(Value)だけを順番に処理する |
| entries | キーと値のペア(MapEntry)を同時に処理する |
void main(){
var scores = {'Math': 90, 'English': 85};
// entriesを使った例
for (var entry in scores.entries) {
print('${entry.key}の点数は ${entry.value}点');
}
}for文との違い
リスト(List)やセット(Set)などのコレクションに含まれるデータを、最初から最後まで順番に1つずつ取り出して処理したい場合に使います。カウンタ変数(iなど)の管理が不要なため、コードが直感的で読みやすくなります。
参考
Google Search
