distinctBy

Elimina duplicados según lo que determine una función de clave, en lugar de por igualdad de valores.

Iterable<A> distinctBy<A, B>(B Function(A a) f, Iterable<A> iterable) FxAsyncIterable<A> distinctByAsync<A, B>(FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable) Fx<T> Fx.distinctBy<B>(B Function(T a) f) // chain FxAsync<T> FxAsync.distinctBy<B>(FutureOr<B> Function(T a) f) Iterable<A> uniqBy<A, B>(B Function(A a) f, Iterable<A> iterable) // FxTS alias

Lección

distinctBy es la forma general de uniq: en vez de comparar los elementos enteros, pasa cada elemento por f y conserva solo el primer elemento que produce cada clave distinta. distinctBy es el nombre idiomático en Dart; fxdart también acepta uniqBy, la grafía de FxTS: son el mismo operador. Es la herramienta para «una fila por cliente», «un evento por tipo» o para deduplicar por cualquier campo o valor calculado — el propio uniq no es más que distinctBy((a) => a, iterable).

Igual que uniq, es perezoso y conserva el orden: gana el primer elemento de cada clave, y el Set<B> interno de claves vistas solo crece a medida que tiras de los valores.

Aquí aplica la misma regla asíncrona que en uniq: pon la concurrencia en un fetch anterior (.map(...).concurrent(n)) y luego aplica distinctBy/distinctByAsync al flujo ya resuelto y en orden.

Demo 1 · Fundamentos

Demo 2 · Asíncrono, con concurrencia aguas arriba

Pruébalo tú

Ejercicio: usa distinctBy para quedarte solo con el primer evento de cada 'type'.

Relacionado: uniq — deduplica por igualdad de valores · differenceBy — elimina por una clave calculada frente a otro iterable · intersectionBy — conserva por una clave calculada compartida con otro iterable · groupBy — conserva todos los elementos, agrupados por clave