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

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

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

コメント

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