flattened
중첩된 이터러블을 지정한 깊이만큼 평탄화합니다 — 문자열은 건드리지 않습니다.
강의
flattened는 중첩된 이터러블 구조를 훑으면서 안쪽 원소를 바깥
시퀀스에 이어 붙입니다. depth 단계까지 내려가며,
기본값은 1입니다. Iterable이기만 하면
"평탄화 대상"으로 보지만, 단 String만은 예외입니다 —
그래서 flattened(['ab', ['cd']])는 'ab'를 글자
단위로 쪼개지 않고 그대로 둡니다. flattened가 Dart다운
이름이고, fxdart는 FxTS식 표기인 flat도 함께 받습니다 —
같은 연산자입니다.
왜 Iterable<dynamic>이며, 왜 그래도 괜찮은가:
TypeScript의 flat에는 "N단계를 평탄화한 뒤의 원소 타입"을
표현할 수 있는 DeepFlat 조건부 타입이 있습니다. Dart의
타입 시스템에는 이에 대응하는 장치가 없습니다 — 입력이 어떤 모양으로
중첩되어 있는지는 런타임에야 알 수 있으므로 정적 원소 타입을 안전하게
계산할 방법이 없습니다. 성립하지 않는 제네릭으로 거짓말을 하는 대신,
Dart 포팅판은 이를 솔직히 인정하고 Iterable<dynamic>을
반환합니다. 평탄화하려는 데이터의 모양을 알고 있고 타입이 붙은 결과를
원한다면 flatMap을 쓰세요.
flatMap((row) => row, matrix)라고 쓰면 정확히 한 단계
깊이의 균일한 데이터를 타입이 유지된 채로 평탄화할 수 있습니다.
FxTS의 flat과 마찬가지로 flattenedAsync도 값이
도착한 시점에 이미 동기 Iterable인 중첩만 파고듭니다 —
중첩 컬렉션 안에 들어 있는 Future를 await하지는 않습니다.
중첩된 리스트들을 병렬로 가져오고 싶다면 상류에
.map(...).concurrent(n) 단계를 두고, 이미 완료된 결과들을
.flattened()로 이어 붙이면 됩니다.
데모 1 · 기본 사용법과 깊이
데모 2 · 비동기, 그리고 동시성
(이미 중첩되어 있는) 결과들을 동시에 가져온 다음, 완료된 리스트들을 평탄화합니다:
직접 해 보기
연습: flattened()로 scoreGroups를 한 단계
평탄화해 보세요.
flatMap — 타입이 유지되는 map + 평탄화를 한 번에 ·
map — 평탄화 없이 변환만 ·
scan — 단계별 누적 연산 ·
concurrent — 병렬 평가