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
mapo funcțieasync. Primești un stream deFuture-uri, nu de valori; foloseșteasyncMap.
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.