sort

비교자로 정렬한 완전히 새로운 리스트를 반환합니다 — 입력은 절대 변경하지 않습니다.

List<A> sort<A>(int Function(A a, A b) f, Iterable<A> iterable) List<A> toSorted<A>(int Function(A a, A b) f, Iterable<A> iterable) // alias of sort Future<List<A>> sortAsync<A>(int Function(A a, A b) f, FxAsyncIterable<A> iterable) Fx<T> Fx.sort(int Function(T a, T b) f) // chain (sync) — still lazy, call .toList() Future<List<T>> FxAsync.sort(int Function(T a, T b) f) // chain (async) — already a terminal

강의

sort는 Dart의 표준 비교자를 받습니다 — ab보다 앞이면 음수, 뒤면 양수, 동등하면 0을 반환하는 그 함수입니다 — 그리고 정렬된 결과를 만들어 냅니다. JavaScript(그리고 FxTS)의 Array.prototype.sort와 결정적으로 다른 점은 FxDart의 sort입력을 절대 변경하지 않는다는 것입니다. 언제나 새 List를 할당하며 (List.of(iterable)..sort(f)), 원본 이터러블은 그대로 남습니다. FxTS는 나중에 원본을 변경하는 sort에 대해 변경을 일으키지 않는 대안으로 toSorted를 추가했지만, FxDart에서 toSorted는 그저 별칭입니다 — sort가 이미 원본을 건드리지 않으니 구분할 이유가 없기 때문입니다.

체인 형태에는 짚고 넘어갈 만한 미묘한 점이 하나 있습니다. 동기 Fx 체인에서 .sort(f)는 또 다른 Fx<T>를 반환합니다 — List<T>가 아닙니다. Fx가 계속 체이닝할 수 있도록 내부의 정렬된 리스트를 감싸기 때문입니다. 여전히 .toList() 같은 종결 연산자를 거쳐야 구체적인 List를 얻을 수 있습니다. 비동기 체인에는 이런 사정이 없습니다. FxAsync.sort(f)는 그 자체가 종결 연산자로서 Future<List<T>>를 바로 반환하는데, 파이프라인 전체를 먼저 await해야 하는 연산에서 FxAsync가 자기 자신을 반환할 수는 없기 때문입니다.

비교자를 직접 작성하는 대신 추출한 키를 기준으로 정렬하고 싶다면 sortBy를 쓰세요.

데모 1 · 기본 사용법, 원본 불변, 그리고 toSorted

데모 2 · 비동기 — 이미 종결 연산자

직접 해 보기

연습: 숫자를 내림차순으로 정렬해 보세요.

관련 항목: sortBy — 비교자 대신 추출한 키로 정렬 · reverse — 비교 없이 순서만 뒤집기 · partition — 술어로 두 리스트로 나누기