Dart StreamクラスfirstWhere()メソッド

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

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);
}

実行結果。

存在しません。

コメント

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