Метод reduce
- T combine(
- T previous,
- T element
Объединяет последовательность значений, многократно применяя combine.
Аналогично Iterable.reduce, эта функция сохраняет значение, начиная с первого элемента этого потока и обновляя его для каждого последующего элемента этого потока. Для каждого элемента после первого значение обновляется до результата вызова combine с предыдущим значением и элементом.
Когда этот поток завершен, возвращаемое будущее завершается значением в этот момент.
Если этот поток пустой, возвращаемое будущее завершается ошибкой. Если этот поток генерирует ошибку или вызов combine вызывает ошибку, возвращаемое будущее завершается этой ошибкой, и обработка останавливается.
Пример:
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.18.5/dart-async/Stream/reduce.html