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에서 그대로 물려받습니다. 더 짧은 쪽, 그러니까 selectorsiterable 중 하나가 먼저 소진되는 순간 순회가 멈추므로, 셀렉터 리스트가 짧으면 결과도 조용히 잘려 나갑니다. 원소마다 술어를 다시 계산하는 filter와 달리, 불리언 마스크를 미리 가지고 있거나 저렴하게 계산할 수 있을 때 — 예를 들어 "어떤 퀴즈 답이 정답이었는가" 같은 경우에 — 꺼내 쓰면 됩니다.

체인 메서드는 없습니다. data-first 함수나 비동기 버전을 직접 호출하거나, 계속 체이닝하고 싶다면 결과를 fx(...) / fxAsync(...)로 감싸면 됩니다.

데모 1 · 기본 사용법과 길이 불일치

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

직접 해 보기

연습: compress로 정답만 남겨 보세요.

관련 항목: filter — 미리 만든 마스크 대신 술어로 거르기 · zip — compress가 기반으로 삼는 함수 · differenceBy — 다른 이터러블에 포함되는지로 거르기 · partition — 한 번의 순회로 남길 것과 버릴 것 나누기