Generators
値のシーケンス(集合)を遅延生成する必要がある場合は、ジェネレーター関数(generator function)の使用を検討してください。
Dartには、次の2種類のジェネレーター関数のサポートが組み込まれています。
Synchronous generator:Iterableオブジェクトを返す。
Asynchronous generator:Streamオブジェクトを返す。
Synchronous generator関数を実装(定義)するには、下記のように関数のボディの前に
sync*
をつけます。そして、関数ボディ内で
yeild
を用いて、要素を生成します。
Iterable<int> naturalsTo(int n) sync* { int k = 0; while (k < n) yield k++; }
Asynchronous generator関数を実装(定義)するには、下記のように関数のボディの前に
async*
を付けます。そして関数ボディ内で
yeild
を用いて、要素(イベント)を生成します。
Stream<int> asynchronousNaturalsTo(int n) async* { int k = 0; while (k < n) yield k++; }
generator関数を再帰的に使用すれば、yeild*を使ってパフォーマンスを上げることができます。
Iterable<int> naturalsDownFrom(int n) sync* { if (n > 0) { yield n; yield* naturalsDownFrom(n - 1); } }
参考