Dart Streamクラスのpipe()メソッドについてメモ書き。
pipe()メソッドはStreamをStreamConsumerにパイプするメソッド。パイプする事でデータを加工できる。
pipe()メソッドは引数で抽象クラスのStreamConsumerを受け取る。StreamConsumerクラスはSinkを実装するためのインターフェースである。Sinkはデータの受け皿でパイプの役割を果たす。
StreamConsumerは抽象クラスなのでimplementsで実装する必要がある。
動作としてはeventTransformedコンストラクタに似ているが、pipe()の戻り値はFuture型でStreamを返さない。
eventTransformedコンストラクタについては以下を参照して欲しい。
Dart StreamクラスeventTransformedコンストラクタ
eventTransformedは受け取ったStreamイベントを加工して出力するコンストラクタ。
StreamConsumerは実装時に以下2つのメソッドをオーバーライドする。
メソッド | 説明 |
---|---|
addStream() | Streamをリッスンし、処理を追加する。 Futureを返す。 |
close() | Streamの追加が完了した後リソースを解放する。 Futureを返す。 |
コーディングで動作を確認。
StreamConsumerクラスを実装するために、dart:asyncライブラリをインポートする。
import 'dart:async';
void main() async {
// StreamConsumerクラスのインスタンスを生成
final cns = SCM<int>();
// Streamを生成
final stream = () async* {
for (int i = 0; i < 5; i++) {
yield i;
}
}();
// pipeメソッドを実行
await stream.pipe(cns);
}
// StreamConsumerクラスを実装
class SCM<S> implements StreamConsumer<S> {
// addStream()をオーバーライド
@override
Future addStream(Stream<S> stream) {
return stream.forEach((element) {
print('Received $element');
});
}
// close()をオーバーライド
@override
Future close() {
print('StreamConsumer is closed');
return Future.value();
}
}
実行結果。
pipe()でStreamConsumerにデータを渡し加工後に出力している。
Received 0
Received 1
Received 2
Received 3
Received 4
StreamConsumer is closed
コメント