Dart StreamクラスのfirstWhere()メソッドについてメモ書き。
firstWhere()は条件にマッチする最初の要素を返すメソッド。
条件は引数のtest関数で実装する。test関数の戻り値はbool型。test関数は引数としてStreamイベントの要素を受け取り、その要素が条件を満たす場合はtrue、条件を満たさない場合はfalseを返す。
firstWhere()には名前付きオプション引数(省略可)としてorElse:があり、test関数がfalseを返した場合の処理を記述する。
Streamのリッスンはマッチする要素が見つかった時、もしくはエラーが発生した時点でストップする。
test関数がfalseを返し、かつorElse:が実装されていない場合、firstWhere()はエラーで終了する。
firstWhere()は戻り値としてFuture<T>を返す。
コーディングで動作を確認。
先ずは値が存在する場合。
void main() async {
final listTest =
Stream.fromIterable(["Apple", "Orange", "Banana", "Pineapple"]);
final fw = await listTest.firstWhere(
(element) => element == "Orange",
);
print(fw);
}
実行結果。
Orange
次は条件にマッチする要素が存在しない、かつorElse:を実装しない場合。
void main() async {
final listTest =
Stream.fromIterable(["Apple", "Orange", "Banana", "Pineapple"]);
final fw = await listTest.firstWhere(
(element) => element == "Rice",
);
print(fw);
}
実行結果。
「Bad state: No element」エラーとなる。
Unhandled exception:
Bad state: No element
#0 Stream.firstWhere.<anonymous closure> (dart:async/stream.dart:1703:9)
#1 _RootZone.runGuarded (dart:async/zone.dart:1582:10)
#2 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#3 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#4 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#5 _MultiStreamController.closeSync (dart:async/stream_impl.dart:1058:36)
#6 new Stream.fromIterable.<anonymous closure>.next (dart:async/stream.dart:377:24)
#7 _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
#8 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
#9 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:123:13)
#10 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:190:5)
最後に条件にマッチする要素が存在しない、かつ名前付きオプション引数のorElse:の動作確認。
void main() async {
final listTest =
Stream.fromIterable(["Apple", "Orange", "Banana", "Pineapple"]);
final fw = await listTest.firstWhere(
(element) => element == "Rice",
orElse: () => "存在しません。",
);
print(fw);
}
実行結果。
存在しません。
コメント