Ce face Stream.fold
fold(start, f) pornește de la start și, pentru fiecare valoare, calculează f(rezultatPanaAcum, valoare). La închiderea stream-ului, future-ul dă rezultatul final. Tipul rezultatului poate fi diferit de tipul valorilor.
reduce(f) pornește de la prima valoare și are același tip ca valorile. Pe un stream gol, reduce se termină cu StateError, iar fold dă valoarea de start.
Parametri
| Parametru | Descriere |
|---|---|
initialValue |
Pentru fold: valoarea de pornire. |
combine |
Funcția care combină rezultatul de până acum cu valoarea nouă. |
Ce returnează
Un Future cu rezultatul final.
Exemple
Exemplul 1: Totalul vânzărilor
Stream<double> vanzari() => Stream.fromIterable([120.5, 89.9, 230.0, 45.6]);
Future<void> main() async {
final total = await vanzari().fold<double>(0, (s, v) => s + v);
print('Total: ${total.toStringAsFixed(2)} lei');
final maxim = await vanzari().reduce((a, b) => a > b ? a : b);
print('Cea mai mare vânzare: $maxim lei');
}
Rezultat
Total: 486.00 lei
Cea mai mare vânzare: 230.0 lei
Exemplul 2: Stream gol: fold față de reduce
Future<void> main() async {
const gol = Stream<int>.empty();
print('fold: ${await gol.fold<int>(0, (a, b) => a + b)}');
try {
await const Stream<int>.empty().reduce((a, b) => a + b);
} on StateError catch (e) {
print('reduce: ${e.message}');
}
}
Rezultat
fold: 0
reduce: No element
Greșeli frecvente
- Folosești
reducepe un stream care poate fi gol. Foloseștefoldcu o valoare de start.
Comenzi înrudite
Stream.join: Lipește toate valorile stream-ului într-un singur text, cu un separator opțional între ele.Iterable.reduce: Combină toate elementele într-o singură valoare: reduce pornește de la primul element, fold de la o valoare dată.Stream.toList: Adună toate valorile stream-ului într-o listă (sau într-un set) când stream-ul se închide.