flattened
Aplana iterables anidados hasta la profundidad indicada — las cadenas se dejan intactas.
Lección
flattened recorre una estructura anidada de iterables e
inserta los elementos interiores en la secuencia exterior, hasta
depth niveles de profundidad (por defecto 1).
Todo lo que sea un Iterable cuenta como «aplanable»
excepto String — así que
flattened(['ab', ['cd']]) conserva 'ab' entero
en vez de descomponerlo en caracteres. flattened es el
nombre idiomático en Dart; fxdart también acepta la grafía
flat de FxTS: son el mismo operador.
Por qué Iterable<dynamic>, y por qué no pasa nada:
el flat de TypeScript tiene un tipo condicional
DeepFlat capaz de describir «el tipo del elemento tras
aplanar N niveles». El sistema de tipos de Dart no tiene un mecanismo
equivalente — la forma del anidamiento de la entrada no se conoce hasta
tiempo de ejecución, así que no hay manera sólida de calcular un tipo de
elemento estático. En lugar de mentir con un genérico que no se sostiene,
el port a Dart es honesto y devuelve Iterable<dynamic>.
Si conoces la forma de lo que estás aplanando y quieres un resultado
tipado, tira de flatMap
en su lugar: flatMap((row) => row, matrix) te da un
aplanado tipado para datos de exactamente un nivel y forma uniforme.
Igual que flat en FxTS, flattenedAsync solo baja
por el anidamiento que ya sea, de forma síncrona, un
Iterable en el momento en que llega — no espera a un Future
escondido dentro de una colección anidada. Combínalo con una etapa previa
.map(...).concurrent(n) para traer las listas anidadas en
paralelo, y deja que .flattened() junte después los resultados
ya resueltos.
Demo 1 · Fundamentos & profundidad
Demo 2 · Asíncrono, con concurrencia
Trae los resultados (ya anidados) de forma concurrente y luego aplana las listas resueltas:
Pruébalo tú
Ejercicio: usa flattened() para aplanar scoreGroups
un nivel.
flatMap — map + aplanado tipado en un solo paso ·
map — transforma sin aplanar ·
scan — acumulación progresiva ·
concurrent — evaluación en paralelo