sortBy
비교자를 손으로 작성하는 대신, 추출한 키를 기준으로 오름차순 정렬합니다.
강의
sortBy는 sort의
편의 버전입니다. (a, b) => a.age.compareTo(b.age)를
직접 쓰는 대신 sortBy에 키 추출 함수 —
(a) => a['age'] — 를 넘기면 추출한 키를 기준으로
정렬합니다. 언제나 오름차순이고, 언제나 추출한 키를
Comparable.compare로 비교합니다.
내부는 결코 sort((a, b) => compare(f(a), f(b)))가
아니며, 그 차이는 여러분의 콜백에서 그대로 드러납니다. 그
형태라면 비교할 때마다 f를 두 번씩, 대략
2·n·log n번 호출하게 됩니다. sortBy는 각 키를
정확히 한 번만 추출한 뒤 그 키로 정렬하므로, 비싼 키
추출 함수라도 2·n·log n번이 아니라 n번만
호출됩니다. 그래도 f는 순수하고 가볍게 유지하세요 — 호출
횟수는 보장되지만, 호출되는 순서는 보장되지 않습니다.
sort의 보장은 하나도 빠짐없이 그대로 적용됩니다.
결과는 언제나 새 리스트이며, 입력을 변경하지
않습니다. 체인 형태의 미묘한 점도 똑같습니다 — 동기
Fx 체인에서 .sortBy(f)는 또 다른
Fx<T>를 반환하므로 구체화하려면 여전히
.toList()가 필요하고,
FxAsync 체인에서 .sortBy(f)는 이미
Future<List<T>>를 반환하는 종결 연산자입니다.
내림차순이나 다중 키 정렬이 필요하다면 비교자를 명시하는
sort로 내려가세요. sortBy는 "추출한 키
하나로 오름차순"이라는 흔한 경우만 다룹니다.
데모 1 · 기본
데모 2 · 비동기 — 이미 종결 연산자
직접 해 보기
연습: 사람들을 나이순으로, 어린 사람이 먼저 오도록 정렬해 보세요.