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 제거