lastWhere 方法

Future<T> lastWhere(
  1. bool test(
    1. T element
    ), {
  2. T orElse()?,
})

查找此流中符合 test 的最后一个元素。

返回一个 future,该 future 在此流的最后一个元素上完成,对于该元素 test 返回 true

如果在完成此流之前没有找到这样的元素,并且提供了 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;
}