fold<S> 方法

Future<S> fold<S>(
  1. S initialValue,
  2. S combine(
    1. S previous,
    2. 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;
}