Ce face Stream.expand
expand cheamă funcția pentru fiecare valoare; funcția returnează un Iterable, iar toate elementele lui sunt emise, în ordine. Dacă iterable-ul este gol, valoarea dispare.
Este util pentru a „despacheta” pachete: de exemplu un stream de linii de text transformat într-un stream de cuvinte.
Parametri
| Parametru | Descriere |
|---|---|
convert |
Funcția care primește o valoare și returnează elementele de emis. |
Ce returnează
Un Stream<S> nou.
Exemple
Exemplul 1: Din linii în cuvinte
Future<void> main() async {
final linii = Stream.fromIterable(['ana are mere', '', 'ion are pere']);
final cuvinte = linii.expand((l) => l.split(' ').where((c) => c.isNotEmpty));
print(await cuvinte.toList());
}
Rezultat
[ana, are, mere, ion, are, pere]
Exemplul 2: Fiecare comandă în produsele ei
Future<void> main() async {
final comenzi = Stream.fromIterable([
['lapte', 'pâine'],
['cafea'],
<String>[],
['ouă', 'brânză', 'roșii'],
]);
var i = 0;
await comenzi.expand((produse) => produse).forEach((p) => print('${++i}. $p'));
}
Rezultat
1. lapte
2. pâine
3. cafea
4. ouă
5. brânză
6. roșii
Greșeli frecvente
- Returnezi un stream din funcția lui
expand. Funcția trebuie să returneze unIterable; pentru stream-uri foloseșteasyncExpand.
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.map: Creează un stream nou în care fiecare valoare este transformată cu o funcție sincronă.Iterable.expand: expand transformă fiecare element în zero sau mai multe elemente și le pune cap la cap; followedBy lipește două iterabile.