Spec-Zone.ru › Dart 2

dart:async

метод reduce

Future<T> reduce(
  1. T combine(
    1. T previous,
    2. T element
    )
)

Объединяет последовательность значений, многократно применяя combine.

Подобно Iterable.reduce, эта функция хранит значение, которое изначально равно первому элементу этого потока и обновляется для каждого следующего элемента. Для каждого элемента после первого значение обновляется результатом вызова combine с предыдущим значением и элементом.

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

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

Пример:

final result = await Stream.fromIterable([2, 6, 10, 8, 2])
    .reduce((previous, element) => previous + element);
print(result); // 28

Реализация

Future<T> reduce(T combine(T previous, T element)) {
  _Future<T> result = new _Future<T>();
  bool seenFirst = false;
  late T value;
  StreamSubscription<T> subscription =
      this.listen(null, onError: result._completeError, onDone: () {
    if (!seenFirst) {
      try {
        // Throw and recatch, instead of just doing
        //  _completeWithErrorCallback, e, theError, StackTrace.current),
        // to ensure that the stackTrace is set on the error.
        throw IterableElementError.noElement();
      } catch (e, s) {
        _completeWithErrorCallback(result, e, s);
      }
    } else {
      result._complete(value);
    }
  }, cancelOnError: true);
  subscription.onData((T element) {
    if (seenFirst) {
      _runUserCode(() => combine(value, element), (T newValue) {
        value = newValue;
      }, _cancelAndErrorClosure(subscription, result));
    } else {
      value = element;
      seenFirst = true;
    }
  });
  return result;
}

© 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/reduce.html

Spec-Zone.ru

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