🎯
Stream where method
Where Stream Example
概要
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()は以下のように動作します:
- ストリームの各要素に対して条件関数を実行
- 条件関数がtrueを返す要素のみを通過
- falseを返す要素は除外
出力例

使用例
- 特定の閾値を超えるデータのフィルタリング
- 特定の条件に一致するイベントの抽出
- エラー値や異常値の除外
- 特定のパターンに一致するデータの選択
重要なポイント
- 条件関数は各要素に対して個別に実行される
- 条件関数がエラーをスローした場合、その要素は除外され、エラーがストリームに流れる
- ブロードキャストストリームの場合、各リスナーに対して個別にフィルタリングが適用される
- フィルタリングは非同期で行われる
関連するStreamメソッド
-
takeWhile(): 条件が真である間だけ要素を取得 -
skipWhile(): 条件が真である間は要素をスキップ -
map(): 各要素を変換(フィルタリングではなく変換) -
expand(): 各要素を0個以上の要素に展開
パフォーマンスの考慮事項
- 条件関数は各要素に対して呼び出されるため、複雑な条件は処理時間に影響する
- フィルタリングされた要素はメモリに保持されない
- 大量のデータをフィルタリングする場合は、条件関数の効率性に注意
エラーハンドリング
stream
.where((value) {
if (value < 0) throw Exception('負の値は無効です');
return value > 3;
})
.listen(
print,
onError: (error) => print('エラー: $error'),
);
ベストプラクティス
- 条件関数は副作用を持たないようにする
- 複雑な条件は別の関数として切り出す
- エラーケースを適切に処理する
- パフォーマンスを考慮して条件を設計する
Discussion