本エントリではList
型データの生成方法を説明する。
Listとは
List
はIterable
を継承したクラスで、複数の要素を格納できる順序ありのデータ型。
Listインスタンスの生成
List
クラスには名前付きコンストラクタが複数個用意されている。
以下で各名前付きコンストラクタを使用したインスタンスの生成方法を説明する。
リテラルを代入
直接リストデータを代入する方法。
<T>
表記(genericsという)でデータ型を指定しない場合List<dynamic>
型になる。
List.empty()
名前の通り空のList
データ[]
が生成される。
List.filled(要素数, 要素の値)
要素の値
を要素数
個格納したList
インスタンスを生成する。
上記のコードではint
型のデータである1
を10個格納したList
が生成されている。
List.from(他のIterable型データ)
他のIterable
型データをコピーしたList
インスタンスを生成する。
List.generate(要素数, 要素を生成するコールバック関数(引数: index))
コールバック関数の引数にindexを受け取り、戻り値が要素となる。これを要素数回繰り返してList
インスタンスを生成する。
ただ言葉だと若干分かりづらいので、上記のコードを例にもう少し詳細に説明する。
List.generate()のちょっと詳しい説明
(index) => index * 2
は次の表記を簡潔にしたもの。
(int index){ return index * 2; }
なので引数に受け取った値を2倍して返す。
List.generate()
では第二引数に割り当てられたコールバック関数を第一引数に割り当てた要素数だけコールする。この時コールバック関数の引数には要素番号(つまりindex)が割り当てられる。そしてコールバック関数の戻り値が、最終的に生成されるList
インスタンスの要素となる。
なのでList
インスタンス生成のフローは次の様になる。
index
に0
が渡され0 * 2
がindex = 0の要素になる。index
に1
が渡され1 * 2
がindex = 1の要素になる。index
に2
が渡され2 * 2
がindex = 2の要素になる。index
に3
が渡され3 * 2
がindex = 3の要素になる。index
に4
が渡され4 * 2
がindex = 4の要素になる。index
に5
が渡され5 * 2
がindex = 5の要素になる。index
に6
が渡され6 * 2
がindex = 6の要素になる。index
に7
が渡され7 * 2
がindex = 7の要素になる。index
に8
が渡され8 * 2
がindex = 8の要素になる。index
に9
が渡され9 * 2
がindex = 9の要素になる。
このステップを経て、最終的には[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
が生成される。
List.of(他のIterable型データ)
他のIterable
型データをコピーしたList
インスタンスを生成する。
List.unmodifiable(他のIterable型データ)
他のIterable
型データをコピーしたList
インスタンスを生成する。
ただし生成されたList
インスタンスは後述するadd
などの要素を変更する操作ができない。