Dartのfor-in文

Flutter/Dart

この記事では、Dartのfor-in文について書いていきます。

サンプル

var fruits = ['オレンジ', 'バナナ', 'モモ', 'スイカ'];
void main(){
for (final object in fruits) {
  print(object);
}
}

書き方

for(リスト要素の型 変数名 in リスト){
   // 繰り返す処理
}

よく使うプロパティ

isEmpty / isNotEmpty(空か値があるかの判定)

​「データが存在するときだけfor文を実行する」という安全策(ガード節)としてよく使われます。

void main(){
var users = ['アリス', 'ボブ'];

if (users.isNotEmpty) {
  for (var user in users) {
    print(user);
  }
}
else if(users.isEmpty){
for(var user in  users){
 print("ユーザーがいません。");
}
}
}

データを持たない場合、以下のような書き方になります。例はユーザーが入力されなかった場合などです。

void main(){
var users = [];

if (users.isNotEmpty) {
  for (var user in users) {
    print(user);
  }
}
else if(users.isEmpty){
  print("ユーザーがいません。");
}
}

reversed(逆順)

​要素を後ろから順に処理したい場合に使用します。例えば、入手したアイテムを古い順に並び替えたいなどです。

void main(){
var x = [1, 2, 3];
// 3, 2, 1 の順で処理される
for (var num in x.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で追加された方です。レコード(Record)を使って、インデックスと要素を同時に分解(デストラクト)しながらループ処理ができます。

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

for (var (index, fruit) in fruits.indexed) {
  print('$index: $fruit');
}
}

Map(連想配列)をfor-in文で回すときのプロパティ

​Mapをfor-in文で処理する場合は、どの部分をループさせたいかによってプロパティを使い分けます。

プロパティ用途
keysキー(Key)だけを順番に処理する
values値(Value)だけを順番に処理する
entriesキーと値のペア(MapEntry)を同時に処理する
void main(){
var tests = {'算数': 90, '英語': 85};

// entriesを使った例
for (var entry in tests.entries) {
  print('${entry.key}の点数は ${entry.value}点');
}
}

for文との違い

リスト(List)やマップ(Map)などのコレクション/配列に含まれるデータを、最初から最後まで連続して順番に1つずつ取り出して処理したい場合に向いています。カウンタ変数(iなど)の宣言や管理が不要なため、コードが比較的直感的に読みやすくなります。

参考

Google Search

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