Stream.fold în Dart

Combină toate valorile stream-ului într-un singur rezultat (sumă, maxim, text); fold pornește de la o valoare dată.

Sintaxă
Future<S> fold<S>(S initialValue, S combine(S previous, T element))
Future<T> reduce(T combine(T previous, T element))

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 reduce pe un stream care poate fi gol. Folosește fold cu 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.