Stream.expand în Dart

Înlocuiește fiecare valoare a stream-ului cu zero, una sau mai multe valori dintr-un Iterable.

Sintaxă
Stream<S> expand<S>(Iterable<S> convert(T element))

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 un Iterable; pentru stream-uri folosește asyncExpand.

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.