differenceBy

difference, comparando por una clave calculada en vez de por igualdad de valor.

Iterable<A> differenceBy<A, B>(B Function(A a) f, Iterable<A> iterable1, Iterable<A> iterable2) FxAsyncIterable<A> differenceByAsync<A, B>(FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable1, FxAsyncIterable<A> iterable2) Fx<T> Fx<T>.differenceBy<B>(B Function(T a) f, Iterable<T> other) // chain: values of the chain not keyed in other

Lección

differenceBy(f, iterable1, iterable2) sigue exactamente la misma regla de orden de argumentos que difference: el resultado sale de iterable2, y conserva solo los elementos cuya clave f no aparezca entre las claves f de iterable1 (colapsando los duplicados del resultado). La función f se aplica a ambos iterables, así que — a diferencia de differenceBy en otros lenguajes — ambos argumentos deben compartir el mismo tipo de elemento A; lo único que se compara es el tipo de clave derivado B.

Esta es la forma que buscas cuando la «lista de exclusión» y la «lista de origen» son registros completos y no valores sueltos: una lista de objetos de usuario bloqueados y una lista de objetos de usuario, emparejadas por id; o una lista de productos no disponibles y un catálogo de productos, emparejados por sku.

difference no es más que differenceBy((a) => a, iterable1, iterable2). No hay método de cadena para ninguna de las dos — llama directamente a la función data-first. En el lado asíncrono, el marcador de concurrencia se aplica a iterable2, igual que en differenceAsync.

Demo 1 · Fundamentos

Demo 2 · Asíncrono, con concurrencia

Pruébalo tú

Ejercicio: usa differenceBy (con clave 'sku') para encontrar los productos que siguen disponibles.

Relacionado: difference — la versión por igualdad de valor · intersectionBy — quedarse con los que comparten la clave calculada · uniqBy — elimina duplicados de un solo iterable por clave · compress — filtra con una máscara booleana paralela