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
コメント