Stream.map în Dart

Creează un stream nou în care fiecare valoare este transformată cu o funcție sincronă.

Sintaxă
Stream<S> map<S>(S convert(T event))

Ce face Stream.map

map aplică funcția pe fiecare valoare, când aceasta sosește, și emite rezultatul în stream-ul nou. Erorile și închiderea trec neschimbate. Tipul valorilor se poate schimba.

Funcția trebuie să fie sincronă. Dacă transformarea este asincronă (de exemplu o cerere la server pentru fiecare valoare), folosește asyncMap.

Parametri

Parametru Descriere
convert Funcția care transformă o valoare.

Ce returnează

Un Stream<S> nou.

Exemple

Exemplul 1: Comenzi transformate în text

Future<void> main() async {
  final comenzi = Stream.fromIterable([('pizza', 35.0), ('supă', 18.5), ('desert', 21.0)]);
  await for (final rand in comenzi.map((c) => '${c.$1}: ${c.$2.toStringAsFixed(2)} lei')) {
    print(rand);
  }
}

Rezultat

pizza: 35.00 lei
supă: 18.50 lei
desert: 21.00 lei

Exemplul 2: Din grade Celsius în Fahrenheit

Stream<double> senzor() async* {
  for (final c in [20.0, 22.5, 25.0]) {
    await Future.delayed(const Duration(milliseconds: 10));
    yield c;
  }
}

Future<void> main() async {
  final fahrenheit = senzor().map((c) => c * 9 / 5 + 32);
  print(await fahrenheit.toList());
}

Rezultat

[68.0, 72.5, 77.0]

Greșeli frecvente

  • Dai lui map o funcție async. Primești un stream de Future-uri, nu de valori; folosește asyncMap.

Comenzi înrudite

  • Stream.asyncMap: asyncMap transformă fiecare valoare cu o funcție asincronă, pe rând; asyncExpand înlocuiește fiecare valoare cu un stream.
  • Stream.where: Creează un stream nou care lasă să treacă doar valorile pentru care testul este adevărat.
  • Stream.expand: Înlocuiește fiecare valoare a stream-ului cu zero, una sau mai multe valori dintr-un Iterable.
  • Iterable.map: Transformă fiecare element cu o funcție și returnează un iterable nou, leneș, cu rezultatele.