Flatten y flatMap

El flatten permite aplastar los elementos de una lista de listas para crear una lista única. Por otra parte, con flatMap podemos combinar un map y un flatten: primero aplicamos map a los elementos de una colección de entrada y luego le hacemos un flatMap.

Este curso ha sido marcado como anticuado y no está siendo revisado de forma activa. Es posible que la información pueda estar desactualizada o que los enlaces se hayan roto.

Cuando trabajamos con colecciones anidadas, es decir, listas que contienen otras listas, a menudo necesitamos simplificar su estructura para poder manejarlas con mayor facilidad. Para ello, contamos con funciones muy útiles como flatten y flatMap, que nos permiten transformar y aplanar estas colecciones complejas.

La función flatten es la herramienta básica para aplastar una lista de listas. Imaginemos que tenemos una lista donde cada elemento es a su vez otra lista. Al aplicar flatten, obtenemos una única lista con todos los elementos de las sublistas concatenados, eliminando así la anidación. Esto resulta especialmente práctico cuando, por ejemplo, extraemos datos de una base de datos y obtenemos una lista de listas, como clientes asignados a diferentes comerciales, y queremos reunirlos todos en una sola lista para procesarlos más fácilmente.

Ahora bien, si queremos transformar los elementos antes de aplanarlos, podemos combinar map y flatten. Por ejemplo, si deseamos multiplicar por dos cada número dentro de las sublistas, primero aplicamos un map que recorra cada sublista y multiplique sus elementos, y luego usamos flatten para aplanar el resultado. Aunque esto funciona, la sintaxis puede resultar un poco engorrosa porque implica un map dentro de otro map.

Aquí es donde flatMap nos ofrece una solución más elegante y eficiente. Esta función combina en una sola operación el mapeo y el aplanamiento. En lugar de escribir un map seguido de un flatten, con flatMap simplemente pasamos una función que transforma cada elemento en una lista, y automáticamente se encarga de aplanar el resultado. Esto no solo simplifica el código, sino que también puede mejorar el rendimiento si se usa correctamente.

Un aspecto interesante de flatMap es que no está limitado a listas de listas. Por ejemplo, si tenemos una lista de números y queremos convertir cada número en una lista que contenga el número y su doble, podemos usar flatMap para lograrlo. La función que pasamos a flatMap devuelve una lista para cada elemento, y luego flatMap aplana todas esas listas en una sola lista final.

List<Integer> numeros = List.of(4, 8, 15, 16, 23, 42);
List<Integer> resultado = numeros.flatMap(x -> List.of(x, x * 2));
System.out.println(resultado); // [4, 8, 8, 16, 15, 30, 16, 32, 23, 46, 42, 84]

En este ejemplo, cada número se transforma en una lista con el número original y su doble, y flatMap aplana todas estas listas en una sola.

Además, flatMap es muy útil cuando trabajamos con cadenas de caracteres, ya que estas pueden considerarse colecciones de caracteres. Si tenemos una lista de cadenas, como marcas de coches, podemos usar flatMap para transformar cada cadena en una lista de caracteres, aplicar alguna transformación, y luego aplanar el resultado en una sola lista de caracteres.

Por ejemplo, si queremos convertir todas las letras de las marcas a mayúsculas y obtener una lista con todas las letras, podemos hacer lo siguiente:

List<String> coches = List.of("BMW", "Mercedes", "Toyota", "Seat", "Renault");
List<Character> letrasMayusculas = coches.flatMap(c -> c.chars()
                                                      .mapToObj(ch -> (char) ch)
                                                      .map(Character::toUpperCase)
                                                      .collect(Collectors.toList()));
System.out.println(letrasMayusculas);

Aquí, para cada cadena, convertimos sus caracteres a mayúsculas y los recogemos en una lista, que luego flatMap aplana en una sola lista de caracteres. Si queremos obtener solo las letras distintas, podemos añadir una operación distinct para eliminar duplicados.

Estas funciones nos permiten manejar colecciones anidadas y cadenas de caracteres de forma muy flexible y eficiente, facilitando la transformación y combinación de datos en nuestras aplicaciones. Con flatten y flatMap, podemos simplificar estructuras complejas y aplicar transformaciones de manera clara y concisa.

Lista de reproducción
  1. 1
    Introducción a Scala
    6 minutos
  2. 2
    Instalar Scala
    6 minutos
  3. 3
    Primeros pasos con el intérprete
    5 minutos
  4. 4
    Variables con val y var
    7 minutos
  5. 5
    Declarando funciones
    7 minutos
  6. 6
    Inciso sobre Units e iguales
    5 minutos
  7. 7
    Presentación de los objetos singleton
    6 minutos
  8. 8
    Editando y compilando archivos
    8 minutos
  9. 9
    Descargar e instalar Scala IDE
    6 minutos
  10. 10
    Proyectos y worksheets en Scala IDE
    7 minutos
  11. 11
    El condicional IF en Scala
    8 minutos
  12. 12
    Un caso sencillo de MATCH
    6 minutos
  13. 13
    Bucles WHILE y DO-WHILE (y String Interpolation)
    7 minutos
  14. 14
    El sistema de tipos
    7 minutos
  15. 15
    Colecciones
    9 minutos
  16. 16
    Funciones básicas de una colección
    8 minutos
  17. 17
    El map (es sensacional)
    8 minutos
  18. 18
    Flatten y flatMap
    9 minutos
  19. 19
    Sets, parte 1 de 3: Set
    8 minutos
  20. 20
    Sets, parte 2 de 3: Sets mutables
    4 minutos
  21. 21
    Sets, parte 3 de 3: SortedSet
    6 minutos
  22. 22
    Mapas (parte 1 de 2): Creando mapas
    9 minutos
  23. 23
    Mapas (parte 2 de 2): Operaciones
    8 minutos
  24. 24
    foreach y for
    8 minutos