Spec-Zone.ru › Dart 2

dart:async

метод firstWhere

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

Находит первый элемент этого потока, соответствующий test.

Возвращает future, который завершается первым элементом этого потока, для которого test возвращает true.

Если до завершения этого потока такой элемент не найден и предоставлена функция orElse, результат вызова orElse становится значением future. Если orElse выбрасывает исключение, возвращённый future завершается с этой ошибкой.

Если этот поток выдаёт ошибку до первого подходящего элемента, возвращённый future завершается с этой ошибкой, и обработка прекращается.

Прослушивание этого потока прекращается после получения первого подходящего элемента или ошибки.

Внутри метод отменяет подписку после первого элемента, соответствующего предикату. Это означает, что потоки с единственной подпиской (не широковещательные) закрываются, и их нельзя использовать повторно после вызова этого метода.

Если возникает ошибка или этот поток завершается без найденного совпадения и без предоставленной функции orElse, возвращённый future завершается с ошибкой.

Пример:

var result = await Stream.fromIterable([1, 3, 4, 9, 12])
    .firstWhere((element) => element % 6 == 0, orElse: () => -1);
print(result); // 12

result = await Stream.fromIterable([1, 2, 3, 4, 5])
    .firstWhere((element) => element % 6 == 0, orElse: () => -1);
print(result); // -1

Реализация

Future<T> firstWhere(bool test(T element), {T orElse()?}) {
  _Future<T> future = new _Future();
  StreamSubscription<T> subscription =
      this.listen(null, onError: future._completeError, onDone: () {
    if (orElse != null) {
      _runUserCode(orElse, future._complete, future._completeError);
      return;
    }
    try {
      // Sets stackTrace on error.
      throw IterableElementError.noElement();
    } catch (e, s) {
      _completeWithErrorCallback(future, e, s);
    }
  }, cancelOnError: true);

  subscription.onData((T value) {
    _runUserCode(() => test(value), (bool isMatch) {
      if (isMatch) {
        _cancelAndValue(subscription, future, value);
      }
    }, _cancelAndErrorClosure(subscription, future));
  });
  return future;
}

© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-async/Stream/firstWhere.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API