Stream.firstWhere în Dart

Dă un Future cu prima valoare din stream care trece testul; cu orElse, o valoare de rezervă dacă nu există.

Sintaxă
Future<T> firstWhere(bool test(T element), {T orElse()?})

Ce face Stream.firstWhere

firstWhere ascultă stream-ul până găsește o valoare pentru care testul este adevărat, apoi anulează ascultarea și dă acea valoare.

Dacă stream-ul se închide fără nicio potrivire, se folosește orElse; fără orElse, future-ul se termină cu StateError.

Parametri

Parametru Descriere
test Condiția căutată.
orElse Opțional: valoarea de rezervă când nu există potrivire.

Ce returnează

Un Future<T>.

Exemple

Exemplul 1: Primul loc liber în parcare

Stream<(int, bool)> locuri() async* {
  for (final loc in [(1, false), (2, false), (3, true), (4, true)]) {
    await Future.delayed(const Duration(milliseconds: 5));
    print('  verific locul ${loc.$1}');
    yield loc;
  }
}

Future<void> main() async {
  final liber = await locuri().firstWhere((l) => l.$2);
  print('Parchează pe locul ${liber.$1}');
}

Rezultat

  verific locul 1
  verific locul 2
  verific locul 3
Parchează pe locul 3

Exemplul 2: Valoare de rezervă cu orElse

Future<void> main() async {
  final note = Stream.fromIterable([6, 7, 8]);
  final zece = await note.firstWhere((n) => n == 10, orElse: () => -1);
  print(zece == -1 ? 'Nimeni nu a luat 10' : 'Primul 10: $zece');
}

Rezultat

Nimeni nu a luat 10

Greșeli frecvente

  • Nu dai orElse și nu există potrivire: apare StateError: No element.

Comenzi înrudite

  • Stream.first: first, last, single și elementAt dau un Future cu o anumită valoare din stream: prima, ultima, singura sau a n-a.
  • Stream.any: any verifică dacă vreo valoare trece testul, every dacă toate îl trec, contains dacă o anumită valoare apare.
  • Iterable.firstWhere: Găsește primul, ultimul sau singurul element care trece un test, cu o valoare de rezervă opțională (orElse).