distinctBy

값의 동등성이 아니라 키 함수가 정하는 기준으로 중복을 제거합니다.

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

강의

distinctByuniq의 일반화된 형태입니다. 원소 전체를 비교하는 대신 각 원소를 f에 통과시켜, 서로 다른 키마다 그 키를 처음 만들어 낸 원소만 남깁니다. distinctBy가 Dart다운 이름이고, fxdart는 FxTS식 표기인 uniqBy도 함께 받습니다 — 같은 연산자입니다. "고객당 한 행", "타입당 이벤트 하나" 같은 요구나 임의의 필드 또는 계산된 값으로 중복을 없앨 때 쓰는 도구이며, uniq 자체도 결국 distinctBy((a) => a, iterable)일 뿐입니다.

uniq와 마찬가지로 지연 평가되고 순서를 보존합니다. 각 키에 대해 가장 먼저 등장한 원소가 살아남고, 이미 본 키를 담는 내부 Set<B>는 값을 끌어당길 때마다 조금씩 커집니다.

비동기 규칙도 uniq와 같습니다. 동시성은 상류의 fetch(.map(...).concurrent(n))에 두고, 이미 해소되어 순서가 정해진 스트림에 distinctBy/distinctByAsync를 적용하세요.

데모 1 · 기본

데모 2 · 비동기, 그리고 상류의 동시성

직접 해 보기

연습: distinctBy로 각 'type'의 첫 이벤트만 남겨 보세요.

관련 항목: uniq — 값의 동등성으로 중복 제거 · differenceBy — 계산된 키로 다른 이터러블과 비교해 제거 · intersectionBy — 계산된 키로 다른 이터러블과 공유되는 것만 남기기 · groupBy — 원소를 모두 남기고 키별로 묶기