flattened

중첩된 이터러블을 지정한 깊이만큼 평탄화합니다 — 문자열은 건드리지 않습니다.

Iterable<dynamic> flattened(Iterable<dynamic> iterable, [int depth = 1]) FxAsyncIterable<dynamic> flattenedAsync(FxAsyncIterable<dynamic> iterable, [int depth = 1]) Fx<dynamic> Fx.flattened([int depth = 1]) // chain FxAsync<dynamic> FxAsync.flattened([int depth = 1]) Iterable<dynamic> flat(...) // FxTS alias

강의

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 — 병렬 평가