Dart StreamクラスeventTransformedコンストラクタ

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

Dart StreamクラスのeventTransformedコンストラクタについてメモ書き。

eventTransformedは受け取ったStreamイベントを加工して出力するコンストラクタ。

第1引数で生成元のStreamを渡し、第2引数でEventSink<T>クラスを渡す。
Sinkはデータの受け皿でパイプの役割を果たす。EventSinkは非同期用のイベントを処理する時に使用する。
EventSinkは抽象クラスなので、implementsで実装する必要がある。
EventSinkはdart:asyncライブラリに含まれている。FutureやStreamと違ってdart:coreで読み込まれていないため、実装時にimportする。
EventSinkでは実装時に以下3つのメソッドをオーバーライドする。

メソッド説明
add()受け取ったデータを加工してSinkに追加する。
addError()エラーをSinkに追加する。
close()Sinkを閉じる。

それではコーディングで動作を確認。
以下の例ではStreamで受け取った数値を2倍に加工し、リスナーに渡している。

import 'dart:async';

// EventSink<T>クラスを実装したMyEventSinkクラスを作成。
class MyEventSink implements EventSink<int> {
  final EventSink<int> _outputSink;

  MyEventSink(this._outputSink);

  // データを加工してSinkに追加。
  void add(int data) {
    _outputSink.add(data * 2);
  }

  // エラー出力をSinkに追加。
  void addError(Object error, [StackTrace? stackTrace]) {
    _outputSink.addError(error, stackTrace);
  }

  // Sinkを閉じる。
  void close() {
    _outputSink.close();
  }
}

void main() {
  // 生成元のStreamを作成。
  final sourceStream = Stream.fromIterable([1, 2, 3, 4, 5]);

  // eventTransformedを定義。
  final transformedStream = Stream.eventTransformed(
    sourceStream,
    (EventSink<int> sink) => MyEventSink(sink),
  );

  // 加工されたStreamをリッスンする。
  transformedStream.listen(print); 
}

(EventSink<int> sink) => MyEventSink(sink)でsourceStreamのデータをMyEventSinkクラスが受け取っている。MyEventSinkクラスに渡されたデータをadd()メソッドは引数として受け取り、数値を2倍に加工した後リスナーに渡している。

実行結果。[1, 2, 3, 4, 5]が2倍になって出力されている。パイプとして機能した事が分かる。

2
4
6
8
10

コメント

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