Uso de la función map

La función map del módulo Enum sirve para transformar uno a uno cada elemento de una colección enumerada, recogiendo cada uno de esos elementos transformados en otra colección resultante que obtenemos tras evaluar.

La función map es una herramienta fundamental para transformar colecciones de datos de manera eficiente y elegante, sin alterar la estructura original. Su funcionamiento se basa en aplicar una función a cada elemento de una lista o mapa, generando una nueva lista con los resultados de esas aplicaciones.

En primer lugar, map es una función de aridad 2, lo que significa que recibe dos parámetros. El primero es un enumerado, como una lista de números [1, 2, 3, 4]. El segundo parámetro es otra función que acepta un único argumento, que será cada uno de los elementos del enumerado. Por ejemplo, si tenemos la lista [1, 2, 3, 4] y una función que multiplica por dos, map aplicará esa función a cada elemento: primero a 1, luego a 2, después a 3 y finalmente a 4.

El resultado es una nueva lista donde cada elemento es el resultado de aplicar la función al elemento correspondiente de la lista original. Así, si aplicamos la función que duplica el valor, obtendremos [2, 4, 6, 8]. Este proceso es lo que se denomina un mapeo, y aunque el nombre pueda llevar a confusión, no tiene relación con mapas geográficos, sino que proviene de la idea de transformar o mapear valores de un conjunto a otro.

Podemos complicar la función que pasamos a map tanto como queramos. Por ejemplo, podemos calcular el resto de dividir cada número entre 3, obteniendo una secuencia cíclica de restos como [1, 2, 0, 1, 2, 0, ...]. También podemos devolver valores booleanos, como true o false, dependiendo de si un número es divisible por otro, y map nos devolverá una lista con esos valores booleanos correspondientes a cada elemento.

Además de listas, map también puede trabajar con mapas (estructuras clave-valor). En este caso, la función que pasamos recibe una tupla con la clave y el valor. Por ejemplo, si tenemos un mapa con claves y valores, podemos usar map para extraer solo las claves o para crear una lista de cadenas que combinen la clave y el valor en un formato legible. El resultado será una lista con esas transformaciones.

Si queremos obtener un mapa a partir de la lista resultante de aplicar map, podemos hacerlo manualmente. Por ejemplo, si aplicamos una función que devuelve una tupla con el número y su doble, obtendremos una lista de tuplas como [{1, 2}, {2, 4}, {3, 6}, {4, 8}]. Luego, usando una función como map.new, podemos convertir esa lista de tuplas en un mapa propiamente dicho.

Es importante entender que map no filtra elementos, como hace filter. En lugar de eso, transforma cada elemento y devuelve todos los resultados, sin eliminar ninguno. Por eso, aunque podamos devolver valores booleanos, la lista resultante tendrá la misma longitud que la original.

Un aspecto a tener en cuenta cuando trabajamos con mapas es el pattern matching. Si no lo hacemos correctamente, podemos obtener resultados inesperados, como recibir tuplas sin procesar en la lista resultante. Por eso, es recomendable asegurarse de que la función que pasamos a map maneje adecuadamente la estructura de los elementos.

Finalmente, aunque map puede parecer sencilla, es fundamental dominar su uso antes de avanzar a funciones más complejas. Su capacidad para transformar colecciones de manera masiva y elegante la convierte en una herramienta imprescindible en programación funcional y en el manejo de datos en general.

Para ilustrar el uso básico de map, podemos ver este ejemplo en código:

lista = [1, 2, 3, 4]

resultado = Enum.map(lista, fn x -> 2 * x end)
# resultado: [2, 4, 6, 8]

Y si queremos trabajar con mapas y extraer solo las claves:

mapa = %{a: 1, b: 2, c: 3}

claves = Enum.map(mapa, fn {k, _v} -> k end)
# claves: [:a, :b, :c]

O para crear una lista de cadenas que combinen clave y valor:

mapa = %{a: 1, b: 2, c: 3}

combinado = Enum.map(mapa, fn {k, v} -> "#{k}: #{v}" end)
# combinado: ["a: 1", "b: 2", "c: 3"]

Si queremos convertir una lista de tuplas en un mapa:

lista_tuplas = [{1, 2}, {2, 4}, {3, 6}, {4, 8}]

mapa = Map.new(lista_tuplas)
# mapa: %{1 => 2, 2 => 4, 3 => 6, 4 => 8}

Así, map nos permite transformar datos de forma clara y concisa, facilitando el procesamiento de colecciones sin complicaciones.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos