distinct

중복 값을 제거하고, 각 값의 첫 등장만 남기면서 순서를 유지합니다.

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

강의

distinct는 이터러블을 한 번만 훑으면서 이미 본 값을 Set에 담아 두고, 각 원소를 처음 등장할 때만 방출합니다. distinct가 Dart다운 이름이고, fxdart는 FxTS식 표기인 uniq도 함께 받습니다 — 같은 연산자입니다. 구현은 uniqBy((a) => a, iterable), 즉 항등 키를 쓰는 형태이므로, 값 전체의 동등성이 아닌 다른 기준으로 중복을 없애야 한다면 uniqBy를 쓰면 됩니다.

지연 평가되며 스트리밍 방식으로 동작합니다. Set은 원소를 끌어당길 때마다 조금씩 커질 뿐, 소스 전체를 미리 버퍼링하지 않습니다. 순서도 보존됩니다 — 살아남는 것은 마지막이 아니라 처음 등장한 값입니다.

비동기 쪽에서는 동시성이 상류의 fetch 단계에 머무는 한 distinctAsync.concurrent(n)과 함께 써도 안전합니다. 먼저 .map(...).concurrent(n)으로 가져온 뒤, 이미 해소되어 순서가 정해진 결과에 .distinct()를 적용하세요. 데모 2가 그 예입니다.

데모 1 · 기본

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

직접 해 보기

연습: distinct로 중복 태그를 제거하되, 처음 등장한 순서를 유지해 보세요.

관련 항목: uniqBy — 계산된 키 기준으로 중복 제거 · difference — 다른 이터러블에 있는 원소 제거 · intersection — 공통 원소만 남기기 · compact — null 제거