Метод fold< S>
- S initialValue,
- S combine(
- S previous,
- T element
Объединяет последовательность значений, многократно применяя combine.
Аналогично Iterable.fold, эта функция сохраняет значение, начиная с initialValue и обновляя его для каждого элемента этого потока. Для каждого элемента значение обновляется результатом вызова combine с предыдущим значением и элементом.
Когда этот поток завершается, возвращаемое будущее завершается значением в этот момент. Для пустого потока будущее завершается значением initialValue.
Если этот поток генерирует ошибку или вызов combine вызывает ошибку, возвращаемое будущее завершается этой ошибкой, и обработка останавливается.
Пример:
final result = await Stream.fromIterable([2, 6, 10, 8, 2])
.fold<int>(10, (previous, element) => previous + element);
print(result); // 38
Реализация
Future<S> fold<S>(S initialValue, S combine(S previous, T element)) {
_Future<S> result = new _Future<S>();
S value = initialValue;
StreamSubscription<T> subscription =
this.listen(null, onError: result._completeError, onDone: () {
result._complete(value);
}, cancelOnError: true);
subscription.onData((T element) {
_runUserCode(() => combine(value, element), (S newValue) {
value = newValue;
}, _cancelAndErrorClosure(subscription, result));
});
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/fold.html