firstOrNull

Devuelve el primer elemento de un iterable, o null si está vacío.

A? firstOrNull<A>(Iterable<A> iterable) Future<A?> firstOrNullAsync<A>(FxAsyncIterable<A> iterable) T? Fx.firstOrNull // sync chain: inherited Iterable getter, no parens Future<T?> FxAsync.firstOrNull() // async chain method A? head<A>(Iterable<A> iterable) // FxTS alias Future<T?> FxEvents<T>.head() / .firstOrNull() // terminal (events)

Lección

firstOrNull toma exactamente un elemento del principio de un iterable y te lo devuelve — o null si no hay ninguno. firstOrNull es el nombre idiomático en Dart (refleja Iterable.firstOrNull); fxdart también acepta la grafía de FxTS head — son el mismo operador. El head de FxTS devuelve undefined con un array vacío; Dart no tiene undefined, así que en esta parte de la API todo resultado del tipo «puede que no exista» se reduce a null. Por eso la forma natural de consumirlo es firstOrNull(list) ?? fallback.

Como firstOrNull solo llama a moveNext() una vez, invocarlo sobre un pipeline perezoso enorme — incluso infinito — no cuesta nada: aguas arriba no se ejecuta nada más allá del único elemento que necesita.

Viene en forma data-first (firstOrNull(iterable)) y en forma asíncrona para FxAsyncIterable. En la cadena síncrona, fx(iterable).firstOrNull es el getter heredado de Iterable — sin paréntesis; en la cadena asíncrona es un método, .firstOrNull().

Demo 1 · Fundamentos

Entra vacío, sale null: sin excepciones y sin necesidad de una retrollamada orElse:

Demo 2 · Pereza y cortocircuito asíncrono

Del rango de un millón de elementos de abajo solo se extrae uno. En el ejemplo asíncrono, la cadena espera el primer delay(...) y ni siquiera llega a molestarse con el segundo:

Pruébalo tú

Ejercicio: usa firstOrNull para que esto imprima la primera puntuación, o 0 cuando la lista esté vacía.

Relacionado: last — la misma idea desde el otro extremo · nth — extrae cualquier índice · find — la primera coincidencia con un predicado · isEmpty — comprobación de vacío basada en el valor