Vamos a explorar la función map en Scala, una herramienta realmente poderosa para transformar colecciones de un tipo en otro de manera sencilla y elegante. Imaginemos que tenemos una lista de números, por ejemplo, 4, 8, 15, 16, 23, 42, y queremos obtener otra lista con el doble de cada uno de estos valores. En lenguajes como Java, normalmente haríamos un bucle for para recorrer cada elemento y añadir el resultado a una nueva lista. Sin embargo, en Scala podemos lograr esto de forma mucho más directa y expresiva usando map.
La función map recibe como parámetro una función que define cómo transformar cada elemento de la colección original. Esta función puede ser una función anónima, también conocida como función lambda, que no tiene nombre y se define directamente en el lugar donde se usa. En Scala, las funciones son objetos de primera clase, lo que significa que podemos pasarlas como argumentos, asignarlas a variables o devolverlas desde otras funciones.
Por ejemplo, si queremos doblar cada número de la lista, podemos escribir algo así:
val numeros = List(4, 8, 15, 16, 23, 42)
val dobles = numeros.map(x => x * 2)
Aquí, x => x * 2 es la función anónima que toma un número x y devuelve su doble. La función map aplica esta transformación a cada elemento de la lista numeros y devuelve una nueva lista con los resultados, en este caso List(8, 16, 30, 32, 46, 84).
Pero no solo podemos usar map para multiplicar números. Si quisiéramos obtener el cuadrado de cada número, bastaría con cambiar la función que pasamos a map:
val cuadrados = numeros.map(x => x * x)
Además, map no se limita a colecciones de números. Podemos usarlo con listas de cualquier tipo. Por ejemplo, si tenemos una lista de nombres de coches:
val coches = List("BMW", "Mercedes", "Seat", "Renault", "Toyota")
Podemos transformar cada nombre a mayúsculas usando map junto con el método toUpperCase:
val cochesMayusculas = coches.map(coche => coche.toUpperCase)
Scala también nos permite simplificar esta sintaxis usando un guion bajo _ como marcador para el parámetro de la función anónima, lo que hace que el código sea aún más conciso:
val cochesMayusculas = coches.map(_.toUpperCase)
Esto es equivalente a la versión anterior, pero más limpio y directo. Podemos aplicar cualquier función a cada elemento, por ejemplo, obtener la longitud de cada nombre de coche:
val longitudes = coches.map(_.length)
En este caso, partimos de una lista de cadenas y obtenemos una lista de enteros con la longitud de cada cadena.
Es importante no confundir la función map con la estructura de datos Map o HashMap. Aunque el nombre es similar, en este contexto map es un método para transformar colecciones, mientras que Map es una estructura que almacena pares clave-valor.
Además de map, existen otras funciones relacionadas como flatMap, que permiten realizar transformaciones más complejas, pero eso lo dejamos para otra ocasión.
Con map podemos convertir colecciones de forma muy flexible y expresiva, evitando bucles explícitos y haciendo que nuestro código sea más claro y funcional.