lastWhere 方法
- bool test(
- T element
- {T orElse(
在当前流中查找符合条件的最后一个元素。
返回一个将完成于当前流中符合 test
条件的最后一个元素的 Future。
如果在此流完成之前未找到此类元素,且提供了一个 orElse
函数,则调用 orElse
的结果将成为 Future 的值。如果 orElse
抛出异常,则返回的 Future 将以该错误完成。
如果此流在任何时刻发出错误,则返回的 Future 将以该错误完成,并且订阅将被取消。
在流完成之前不能提供非错误的结果。
与 firstWhere 类似,不同之处在于它找到的是最后一个匹配的元素而不是第一个。
示例
var result = await Stream.fromIterable([1, 3, 4, 7, 12, 24, 32])
.lastWhere((element) => element % 6 == 0, orElse: () => -1);
print(result); // 24
result = await Stream.fromIterable([1, 3, 4, 7, 12, 24, 32])
.lastWhere((element) => element % 10 == 0, orElse: () => -1);
print(result); // -1
实现
Future<T> lastWhere(bool test(T element), {T orElse()?}) {
_Future<T> future = new _Future();
late T result;
bool foundResult = false;
StreamSubscription<T> subscription =
this.listen(null, onError: future._completeError, onDone: () {
if (foundResult) {
future._complete(result);
return;
}
if (orElse != null) {
_runUserCode(orElse, future._complete, future._completeError);
return;
}
try {
throw IterableElementError.noElement();
} catch (e, s) {
_completeWithErrorCallback(future, e, s);
}
}, cancelOnError: true);
subscription.onData((T value) {
_runUserCode(() => test(value), (bool isMatch) {
if (isMatch) {
foundResult = true;
result = value;
}
}, _cancelAndErrorClosure(subscription, future));
});
return future;
}