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;
}