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: () => nullpe o listă de tip ne-nullabil (List<int>): nu se compilează, pentru căorElsetrebuie să returneze tot unint. Foloseștewhere(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ă.