lastWhere 方法

Future<T> lastWhere(
  1. bool test(
    1. T element
    ),
  2. {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;
    }