distinct

Elimina los valores duplicados, quedándose con la primera aparición de cada uno y conservando el orden.

Iterable<A> distinct<A>(Iterable<A> iterable) FxAsyncIterable<A> distinctAsync<A>(FxAsyncIterable<A> iterable) Fx<T> Fx.distinct() // chain FxAsync<T> FxAsync.distinct() Iterable<A> uniq<A>(Iterable<A> iterable) // FxTS alias

Lección

distinct recorre el iterable una sola vez, manteniendo un Set con los valores ya vistos, y emite cada elemento únicamente la primera vez que aparece. distinct es el nombre idiomático en Dart; fxdart también acepta uniq, la grafía de FxTS: son el mismo operador. Está implementado como uniqBy((a) => a, iterable) —con la clave identidad—, así que si alguna vez necesitas deduplicar por algo que no sea la igualdad del valor completo, recurre a uniqBy en su lugar.

Es perezoso y en streaming: el Set solo crece a medida que se piden elementos, así que nunca almacena la fuente entera por adelantado. El orden se conserva: lo que sobrevive es la primera aparición de un valor, no la última.

En el lado asíncrono, distinctAsync se puede combinar sin riesgo con .concurrent(n) siempre que la concurrencia viva en una etapa de fetch anterior: primero descarga con .map(...).concurrent(n) y luego aplica .distinct() a los resultados ya resueltos y en orden, como en la Demo 2.

Demo 1 · Fundamentos

Demo 2 · Asíncrono, con concurrencia aguas arriba

Pruébalo tú

Ejercicio: usa distinct para eliminar las etiquetas duplicadas, conservando el orden de primera aparición.

Relacionado: uniqBy — deduplica por una clave calculada · difference — elimina los elementos presentes en otro iterable · intersection — conserva solo los elementos comunes · compact — descarta los null