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:が実行される。
要素に含まれていません。
コメント