takeUniqBy
키가 새로운 원소를 앞에서부터 count개까지 리스트로 — 키가 null이면 그 원소를 건너뛰므로, 콜백 하나가 선택과 키 계산을 겸합니다.
강의
takeUniqBy(3, key, xs)는
filter +
uniqBy +
take를 하나의 즉시(strict) 호출로 쓴
것입니다. List를 반환하고, 호출하는 순간 실행되며, 개수가
채워지는 즉시 멈춥니다 — 그 뒤의 원소는 아예 보지 않습니다. 한 가지
비틀림은 콜백입니다: 키를 반환하되 null을 반환하면 "이
원소는 건너뛴다"는 뜻입니다. filter_map 형태이고, 함수
하나가 둘의 일을 하게 만드는 장치입니다.
기본은 체인으로 쓰십시오. 이름 붙은 세 단계가 두 일을 겸하는 콜백 하나보다 잘 읽히고, 지연 체인도 똑같이 단축 평가합니다. 이 연산자가 존재하는 이유는 하나뿐이며, 그게 무엇인지 아는 편이 좋습니다.
존재 이유: 컴파일러가 볼 수 없는 콜백
지연 단계는 콜백을 이터레이터의 필드에 담아 둡니다. AOT 컴파일러는 필드 너머를 보지 못하므로 그 클로저는 결코 인라인되지 않습니다 — 원소마다 실제 간접 호출을 한 번씩 내고, 본문이 주변 루프에 녹아들지도 못합니다. 단계가 둘이면 원소당 호출이 둘입니다. 관용적인 FxDart 체인과 손으로 쓴 루프를 갈라놓는 것의 대부분이 이것입니다.
takeUniqBy는 콜백을 호출자에 인라인될 만큼 작은 본문의
매개변수로 받습니다. 그래서 컴파일러가 클로저 본문을 함께
인라인합니다. 로그 100만 줄, AOT 기준 측정값:
| 표현 | 시간 |
|---|---|
filter().uniqBy().take(3) | 13.7 ms |
takeUniqBy(3, …) | 11.3 ms |
| 손으로 쓴 루프 | 10.2 ms |
두 표현과 두 막대 모두 최근 오류 메시지, 중복 제거 페이지에 있습니다 — 같은 파이프라인을 쓰는 두 방식의 차이가 그 페이지가 말하려는 바라서, 유일하게 막대를 둘이 아니라 셋 싣습니다.
정리하면: 파이프라인이 뜨거운 경로에 있고 프로파일이 이 콜백들을 지목할 때 꺼내십시오. 그전에는 아닙니다. FxTS에 대응물이 없는 fxdart 확장이며, async 짝도 없습니다 — 이득이 인라인인데 async 기계장치가 그것을 압도하기 때문입니다.
데모 1 · 가장 최근의 서로 다른 오류 3개
데모 2 · null은 건너뛰고, count는 상한
직접 해보기
연습: 특정 페이지에 처음 도달한 서로 다른 사용자 3명.
uniqBy — 이 연산자가 접어 넣은 지연 중복 제거 ·
take — 접어 넣은 지연 개수 제한 ·
uniqStrict — 같은 계열의 다른 즉시 연산자 ·
성능 — 콜백 바닥값이 어디서 오는지