Iterable.firstOrNull în Dart

Primul, ultimul sau singurul element, ori null în loc de excepție când nu există.

Sintaxă
E? get firstOrNull
E? get lastOrNull
E? get singleOrNull

Ce face Iterable.firstOrNull

Aceste proprietăți (extensii din dart:core, de la Dart 3.0) sunt variantele sigure ale lui first, last și single. firstOrNull și lastOrNull returnează null pe o colecție goală. singleOrNull returnează null dacă nu există niciun element sau dacă sunt mai multe.

Se combină bine cu where și cu operatorul ??: lista.where(test).firstOrNull ?? 'implicit'.

Ce returnează

Elementul sau null; tipul este E?.

Exemple

Exemplul 1: Fără excepții pe liste goale

void main() {
  final comenzi = <String>[];
  print(comenzi.firstOrNull);
  print(comenzi.lastOrNull ?? 'nicio comandă');

  comenzi.addAll(['pizza', 'supă']);
  print('${comenzi.firstOrNull}, ${comenzi.lastOrNull}');
  print('singleOrNull pe 2 elemente: ${comenzi.singleOrNull}');
}

Rezultat

null
nicio comandă
pizza, supă
singleOrNull pe 2 elemente: null

Exemplul 2: Căutare cu valoare implicită

void main() {
  final angajati = {'Ana': 'IT', 'Mihai': 'vânzări', 'Ioana': 'IT'};
  String primulDin(String dep) =>
      angajati.keys.where((n) => angajati[n] == dep).firstOrNull ?? '(nimeni)';
  print('IT: ${primulDin('IT')}');
  print('HR: ${primulDin('HR')}');
  print('singur în vânzări: ${angajati.keys.where((n) => angajati[n] == 'vânzări').singleOrNull}');
}

Rezultat

IT: Ana
HR: (nimeni)
singur în vânzări: Mihai

Greșeli frecvente

  • Folosești singleOrNull ca să afli dacă există un element. Când sunt două sau mai multe returnează tot null, la fel ca la zero.

Comenzi înrudite

  • Iterable.first: first și last dau primul și ultimul element; single dă singurul element și verifică faptul că este unul singur.
  • Iterable.firstWhere: Găsește primul, ultimul sau singurul element care trece un test, cu o valoare de rezervă opțională (orElse).
  • Iterable.elementAt: Returnează elementul de la o poziție; elementAtOrNull returnează null dacă poziția nu există.
  • Iterable.nonNulls: Elementele care nu sunt null, cu tipul ne-nullabil (din Iterable<T?> obții Iterable<T>).