ifEmpty

Cambia a un respaldo cuando el pipeline resulta estar vacío — decidido perezosamente, en el momento de iterar.

Iterable<A> ifEmpty<A>(Iterable<A> Function() fallback, Iterable<A> iterable) Iterable<A> defaultIfEmpty<A>(A value, Iterable<A> iterable) FxAsyncIterable<A> ifEmptyAsync<A>(FxAsyncIterable<A> Function() fallback, FxAsyncIterable<A> iterable) FxAsyncIterable<A> defaultIfEmptyAsync<A>(FutureOr<A> value, FxAsyncIterable<A> iterable) Fx<T> Fx<T>.ifEmpty(Iterable<T> Function() fallback) / .defaultIfEmpty(T value) // chain (sync) FxAsync<T> FxAsync<T>.ifEmpty(FxAsyncIterable<T> Function() fallback) / .defaultIfEmpty(FutureOr<T> value) // chain (async)

Lección

Un pipeline que podría no producir nada suele forzar un desvío: materializarlo, comprobar isEmpty, ramificar. Eso rompe la cadena y — peor — ejecuta el pipeline antes de lo que querías. ifEmpty(fallback) pliega esa rama dentro del propio pipeline: los valores pasan intactos, y solo si la fuente termina sin producir nada toma el relevo el iterable de respaldo. La función de respaldo ni siquiera se llama en caso contrario — perezoso en ambas direcciones.

defaultIfEmpty(value) es el atajo de un solo valor: la fila de relleno, el 0 para un informe vacío, el marcador de «sin resultados». Ambos componen en cualquier punto de la cadena, lo cual importa tras un filtrado agresivo — la vacuidad la decide lo que llegue hasta este punto, no la fuente original.

Extensión de fxdart (sin contraparte en FxTS), inspirada en switchIfEmpty / defaultIfEmpty de Rx. Las formas async aceptan una cadena de respaldo asíncrona y un valor por defecto en Future, y componen con concurrent.

Demo 1 · Un valor por defecto para el informe vacío

Demo 2 · Fuente de respaldo, jamás tocada si no hace falta

Pruébalo tú

Ejercicio: busca con una consulta de respaldo.

Relacionado: filter — la razón habitual de que una cadena acabe vacía · concat — anexar incondicionalmente · headnull en lugar de un respaldo, para un único valor