Iterable.firstWhere în Dart

Găsește primul, ultimul sau singurul element care trece un test, cu o valoare de rezervă opțională (orElse).

Sintaxă
E firstWhere(bool test(E element), {E orElse()?})
E lastWhere(bool test(E element), {E orElse()?})
E singleWhere(bool test(E element), {E orElse()?})

Ce face Iterable.firstWhere

firstWhere returnează primul element pentru care test este adevărat, iar lastWhere ultimul. singleWhere cere să existe exact un astfel de element și aruncă StateError dacă găsește mai multe.

Dacă niciun element nu trece testul, toate trei aruncă StateError, cu excepția cazului în care dai parametrul orElse: o funcție care returnează valoarea de rezervă. Pentru un rezultat null când nu se găsește nimic, mai simplu este where(test).firstOrNull.

Parametri

Parametru Descriere
test Condiția pe care o caută.
orElse Opțional: funcția care dă rezultatul când nu se găsește nimic.

Ce returnează

Elementul găsit sau valoarea dată de orElse.

Exemple

Exemplul 1: Prima și ultima comandă mare

void main() {
  final comenzi = [120, 45, 300, 80, 510, 60];
  print('prima peste 200: ${comenzi.firstWhere((c) => c > 200)}');
  print('ultima peste 200: ${comenzi.lastWhere((c) => c > 200)}');
  print('singura peste 400: ${comenzi.singleWhere((c) => c > 400)}');
  print('peste 1000: ${comenzi.firstWhere((c) => c > 1000, orElse: () => 0)}');
}

Rezultat

prima peste 200: 300
ultima peste 200: 510
singura peste 400: 510
peste 1000: 0

Exemplul 2: Căutarea unui utilizator după email

class Utilizator {
  final String nume;
  final String email;
  Utilizator(this.nume, this.email);
}

void main() {
  final utilizatori = [
    Utilizator('Ana', 'ana@exemplu.ro'),
    Utilizator('Mihai', 'mihai@exemplu.ro'),
  ];
  final gasit = utilizatori.firstWhere((u) => u.email == 'mihai@exemplu.ro');
  print('Găsit: ${gasit.nume}');
  try {
    utilizatori.firstWhere((u) => u.email == 'ion@exemplu.ro');
  } on StateError catch (e) {
    print('Negăsit: $e');
  }
}

Rezultat

Găsit: Mihai
Negăsit: Bad state: No element

Greșeli frecvente

  • Scrii orElse: () => null pe o listă de tip ne-nullabil (List<int>): nu se compilează, pentru că orElse trebuie să returneze tot un int. Folosește where(test).firstOrNull.

Comenzi înrudite

  • Iterable.where: Păstrează doar elementele care trec un test; whereType păstrează doar elementele de un anumit tip.
  • Iterable.first: first și last dau primul și ultimul element; single dă singurul element și verifică faptul că este unul singur.
  • Iterable.firstOrNull: Primul, ultimul sau singurul element, ori null în loc de excepție când nu există.
  • List.indexOf: Găsește poziția unui element (prima sau ultima apariție) sau a primului element care trece un test; -1 dacă nu există.
  • Stream.firstWhere: Dă un Future cu prima valoare din stream care trece testul; cu orElse, o valoare de rezervă dacă nu există.