🎯

Stream where method

に公開

Where Stream Example

https://api.dart.dev/dart-async/Stream/where.html

概要

where()メソッドは、Streamの要素をフィルタリングする機能を提供します。指定した条件に一致する要素のみを通過させ、条件に一致しない要素は除外します。

コードの説明

Stream生成部分

Stream<int> whereSleepStream() async* {
  var count = 0;
  final random = Random();
  
  while (count < 10) {
    final value = random.nextInt(6); // 0から5までのランダムな値
    yield value;
    await Future<void>.delayed(Duration(seconds: 1));
    count++;
  }
}
  • 0から5までのランダムな値を生成
  • 1秒間隔で値を出力
  • 合計10個の値を生成

where()の使用方法

// 3時間以上のみをフィルタリング
stream.where((hours) => hours >= 3).listen(...);

// 偶数時間のみをフィルタリング
stream.where((hours) => hours % 2 == 0).listen(...);

where()は以下のように動作します:

  1. ストリームの各要素に対して条件関数を実行
  2. 条件関数がtrueを返す要素のみを通過
  3. falseを返す要素は除外

出力例

使用例

  1. 特定の閾値を超えるデータのフィルタリング
  2. 特定の条件に一致するイベントの抽出
  3. エラー値や異常値の除外
  4. 特定のパターンに一致するデータの選択

重要なポイント

  • 条件関数は各要素に対して個別に実行される
  • 条件関数がエラーをスローした場合、その要素は除外され、エラーがストリームに流れる
  • ブロードキャストストリームの場合、各リスナーに対して個別にフィルタリングが適用される
  • フィルタリングは非同期で行われる

関連するStreamメソッド

  • takeWhile(): 条件が真である間だけ要素を取得
  • skipWhile(): 条件が真である間は要素をスキップ
  • map(): 各要素を変換(フィルタリングではなく変換)
  • expand(): 各要素を0個以上の要素に展開

パフォーマンスの考慮事項

  • 条件関数は各要素に対して呼び出されるため、複雑な条件は処理時間に影響する
  • フィルタリングされた要素はメモリに保持されない
  • 大量のデータをフィルタリングする場合は、条件関数の効率性に注意

エラーハンドリング

stream
    .where((value) {
      if (value < 0) throw Exception('負の値は無効です');
      return value > 3;
    })
    .listen(
      print,
      onError: (error) => print('エラー: $error'),
    );

ベストプラクティス

  1. 条件関数は副作用を持たないようにする
  2. 複雑な条件は別の関数として切り出す
  3. エラーケースを適切に処理する
  4. パフォーマンスを考慮して条件を設計する

Discussion