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

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

Dart StreamクラスのlastWhere()メソッドについてメモ書き。

lastWhere()は指定した条件にマッチする最後の要素を返すメソッド。
引数のtest()関数に条件を記述する。test()関数の戻り値はbool型で、条件にマッチする場合はtrueを、マッチしない場合はfalseを返す。
test()関数の条件にマッチしない場合の処理を、名前付きオプション引数(省略可)のorElse:に記述できる。
「orElse:を指定しない」、かつ「条件にマッチしない」場合はエラーとなる。
lastWhere()はFuture<T>型を返す。

コーディングで動作確認。
test()関数の条件は「”apple”が含まれる文字列」。

void main() async {
  final listTest =
      Stream.fromIterable(["apple", "orange", "banana", "pineapple"]);
  await listTest
      .lastWhere(
        (element) => element.contains("apple"),
      )
      .then(print);
}

実行結果。

pineapple

次の条件は「”Apple”が含まれる文字列」。

void main() async {
  final listTest =
      Stream.fromIterable(["apple", "orange", "banana", "pineapple"]);
  await listTest
      .lastWhere(
        (element) => element.contains("Apple"),
      )
      .then(print);
}

実行結果。
存在しないのでエラーとなる。

Unhandled exception:
Bad state: No element
#0      Stream.lastWhere.<anonymous closure> (dart:async/stream.dart:1754: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:を確認。
条件は同じく「”Apple”が含まれる文字列」。

void main() async {
  final listTest =
      Stream.fromIterable(["apple", "orange", "banana", "pineapple"]);
  await listTest
      .lastWhere(
        (element) => element.contains("Apple"),
        orElse: () => "要素に含まれていません。",
      )
      .then(print);
}

実行結果。
条件にマッチしないので、orElse:が実行される。

要素に含まれていません。

コメント

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