Dart StreamクラスのsingleWhere()メソッドについてメモ書き。
singleWhere()は条件を満たす要素1つを返すメソッド。Future<T>型を返す。
第1引数はtest関数で条件を記述する。test関数の戻り値はbool型で、条件にマッチする要素を1つ見つけた場合はtrue、そうでない場合はfalseを返す。
第2引数は名前付きオプション引数orElse:()で、条件にマッチする要素が無かった場合の処理を記述する。orElse:()を指定しない場合はエラーになる。
複数の要素が条件にマッチする場合は、orElse:()に関わらず例外が発生する。
コーディングで動作を確認。
Streamの要素に”ora”が入っているものを抽出する。
void main() async {
final stream =
Stream.fromIterable(["apple", "orange", "banana", "pineapple"]);
await stream.singleWhere((element) => element.contains("ora")).then(print);
}
実行結果。
orange
次はorElse:()を追加し、条件に一致しない場合を確認。
void main() async {
final stream =
Stream.fromIterable(["apple", "orange", "banana", "pineapple"]);
await stream
.singleWhere(
(element) => element.contains("zero"),
orElse: () => "No Match",
)
.then(print);
}
実行結果。条件にマッチしないので、orElse:()が実行される。
No Match
最後は条件にマッチする要素が複数存在する場合を確認。
void main() async {
final stream =
Stream.fromIterable(["apple", "orange", "banana", "pineapple"]);
await stream
.singleWhere(
(element) => element.contains("apple"),
orElse: () => "No Match",
)
.then(print);
}
実行結果。
例外が発生する。
Unhandled exception:
Bad state: Too many elements
コメント