compress
나란히 놓인 불리언 리스트가 true인 위치의 원소만 남깁니다.
Iterable<B> compress<B>(List<bool> selectors, Iterable<B> iterable)
FxAsyncIterable<B> compressAsync<B>(List<bool> selectors, FxAsyncIterable<B> iterable)
강의
compress는 위치 기반 마스크입니다. i번 위치의
iterable 원소는 selectors[i]가 true일
때만 살아남습니다. 이미 알고 있는 두 함수만으로 그대로 만들어져 있습니다 —
map((r) => r.$2, filter((r) => r.$1, zip(selectors, iterable))) —
마스크와 데이터를 zip한 뒤 true인 쌍만 걸러 내고 값을 꺼내는 식입니다.
그래서 길이가 어긋날 때의 동작도 zip에서 그대로 물려받습니다.
더 짧은 쪽, 그러니까 selectors와 iterable
중 하나가 먼저 소진되는 순간 순회가 멈추므로, 셀렉터 리스트가 짧으면 결과도
조용히 잘려 나갑니다. 원소마다 술어를 다시 계산하는 filter와
달리, 불리언 마스크를 미리 가지고 있거나 저렴하게 계산할 수 있을 때
— 예를 들어 "어떤 퀴즈 답이 정답이었는가" 같은 경우에 — 꺼내 쓰면 됩니다.
체인 메서드는 없습니다. data-first 함수나 비동기 버전을 직접 호출하거나,
계속 체이닝하고 싶다면 결과를 fx(...) /
fxAsync(...)로 감싸면 됩니다.
데모 1 · 기본 사용법과 길이 불일치
데모 2 · 비동기, 그리고 동시성
직접 해 보기
연습: compress로 정답만 남겨
보세요.
관련 항목:
filter — 미리 만든 마스크 대신 술어로 거르기 ·
zip — compress가 기반으로 삼는 함수 ·
differenceBy — 다른 이터러블에 포함되는지로 거르기 ·
partition — 한 번의 순회로 남길 것과 버릴 것 나누기