difference

Devuelve los elementos del segundo iterable que no aparecen en el primero — el orden de los argumentos importa.

Iterable<A> difference<A>(Iterable<A> iterable1, Iterable<A> iterable2) FxAsyncIterable<A> differenceAsync<A>(FxAsyncIterable<A> iterable1, FxAsyncIterable<A> iterable2) Fx<T> Fx<T>.difference(Iterable<T> other) // chain: values of the chain not in other

Lección

Lee la firma con atención: difference(iterable1, iterable2) recorre iterable2 y emite cada uno de sus elementos que no se encuentre en iterable1 (sin duplicados, como uniq). iterable1 se usa únicamente como conjunto de pertenencia contra el que comprobar — ninguno de sus propios elementos puede aparecer en la salida, y sus duplicados dan igual. Este orden no es simétrico: intercambiar los argumentos produce un resultado completamente distinto (y por lo general de distinta longitud). Una forma útil de recordarlo: piensa en iterable1 como «la lista de exclusión» y en iterable2 como «la lista que estás filtrando».

Por dentro es differenceBy((a) => a, iterable1, iterable2) — mira differenceBy si necesitas comparar por una clave calculada en vez de por igualdad de valor.

No hay método de cadena para difference; solo existe como función data-first (y su contraparte asíncrona). En el lado asíncrono, el marcador de concurrencia de .concurrent(n) se aplica a iterable2 — el conjunto de exclusión de iterable1 siempre se consume por completo antes de que empiecen a fluir los resultados.

Demo 1 · Fundamentos & orden de los argumentos

Demo 2 · Asíncrono, con concurrencia

Pruébalo tú

Ejercicio: usa difference para encontrar las tareas de allTasks que aún no están en completed.

Relacionado: differenceBy — lo mismo, por una clave calculada · intersection — quedarse con los elementos comunes en su lugar · uniq — elimina duplicados de un solo iterable · includes — comprueba la pertenencia en un solo iterable