Iterable.reduce în Dart

Combină toate elementele într-o singură valoare: reduce pornește de la primul element, fold de la o valoare dată.

Sintaxă
E reduce(E combine(E value, E element))
T fold<T>(T initialValue, T combine(T previousValue, E element))

Ce face Iterable.reduce

reduce ia primul element, îl combină cu al doilea, rezultatul cu al treilea și așa mai departe. Rezultatul are același tip ca elementele. Pe o colecție goală aruncă StateError.

fold pornește de la o valoare inițială pe care o dai tu și poate produce un tip diferit (de exemplu, suma lungimilor unor texte). Pe o colecție goală returnează valoarea inițială, deci este alegerea mai sigură.

Parametri

Parametru Descriere
combine Funcția care primește rezultatul de până acum și elementul curent și returnează noul rezultat.
initialValue Pentru fold: valoarea de start.

Ce returnează

Valoarea finală a combinării.

Exemple

Exemplul 1: Suma, maximul și media

void main() {
  final note = [9, 7, 10, 8];
  final suma = note.reduce((a, b) => a + b);
  final maxim = note.reduce((a, b) => a > b ? a : b);
  print('suma = $suma, maxim = $maxim');
  print('media = ${(suma / note.length).toStringAsFixed(2)}');
}

Rezultat

suma = 34, maxim = 10
media = 8.50

Exemplul 2: fold cu alt tip și pe o listă goală

fold merge și pe liste goale; reduce aruncă eroare.

void main() {
  final orase = ['Iași', 'Cluj', 'Timișoara'];
  final litere = orase.fold(0, (total, oras) => total + oras.length);
  print('Total litere: $litere');

  final cos = <double>[];
  print('Total coș gol: ${cos.fold(0.0, (a, b) => a + b)}');
  try {
    cos.reduce((a, b) => a + b);
  } on StateError catch (e) {
    print('reduce pe listă goală: $e');
  }
}

Rezultat

Total litere: 17
Total coș gol: 0.0
reduce pe listă goală: Bad state: No element

Greșeli frecvente

  • Folosești reduce pe o listă care poate fi goală: programul se oprește cu Bad state: No element. Folosește fold.
  • Scrii fold(0, ...) pentru numere zecimale: tipul rezultatului devine int și apare o eroare de tip. Pornește de la 0.0.

Comenzi înrudite

  • Iterable.every: every verifică dacă toate elementele trec testul; any verifică dacă măcar unul îl trece.
  • Iterable.join: Lipește elementele într-un singur text, cu un separator între ele.
  • Stream.fold: Combină toate valorile stream-ului într-un singur rezultat (sumă, maxim, text); fold pornește de la o valoare dată.