Dart StreamクラスasyncExpand()メソッド

Dar言語StreamクラスtoSet()メソッドDart

Dart StreamクラスのasyncExpand()メソッドについてメモ書き。

asyncExpand()は受け取ったStreamイベントを変換し、新しいStreamイベントを返すメソッド。
引数のconvert関数で受け取ったStreamイベントに対して変換処理を行う。
convert関数の戻り値がnullの場合、その処理をスキップする。nullを含むStreamはスキップされない事に注意。
似たメソッドにasyncMap()がある。違いはconvert関数の戻り値で、asyncMap()はFutureOr<T>を返すのに対して、asyncExpand()はStream<E>?を返す。

それではコーディングで確認。

void main() async {
  final stream = Stream<int?>.fromIterable([1, 2, null, 4, 5]);

  final expdStream = stream.asyncExpand((event) {
    if (event == null) {
      return null;
    }
    return Stream.value(event * event);
  });
  expdStream.listen(print);
}

実行結果。
イベントの処理結果が返されるが、nullは戻り値として返らない。

1
4
16
25

次はnullを含むStreamを返してみる。

void main() async {
  final stream = Stream<int?>.fromIterable([1, 2, null, 4, 5]);

  final expdStream = stream.asyncExpand((event) {
    if (event == null) {
      return Stream.value(event);
    }
    return Stream.value(event * event);
  });
  expdStream.listen(print);
}

実行結果。
Streamにnullを含む場合は、スキップされずにnullが返される。

1
4
null
16
25

convert関数はStream<E>?を返すので、returnではなくasync*とyield(非同期ジェネレーター)で生成した値を返すことができる。

void main() async {
  final stream = Stream<int?>.fromIterable([1, 2, null, 4, 5]);

  final expdStream = stream.asyncExpand((event) async* {
    if (event == null) {
      yield null;
    } else {
      for (int i = 0; i < 5; i++) {
        yield i * event;
      }
    }
  });
  expdStream.listen(print);
}

実行結果。

0
1
2
3
4
0
2
4
6
8
null
0
4
8
12
16
0
5
10
15
20

コメント

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