Las comprensiones for en Scala son una característica poderosa que permite trabajar con colecciones y otras estructuras de datos de manera concisa y expresiva. Las comprensiones for son similares a los bucles for en otros lenguajes de programación, pero ofrecen una mayor flexibilidad y funcionalidad.

Conceptos Clave

  1. Sintaxis Básica: La comprensión for tiene una sintaxis específica que incluye generadores, filtros y definiciones.
  2. Generadores: Son las partes de la comprensión for que producen valores a partir de colecciones.
  3. Filtros: Permiten incluir condiciones que los elementos deben cumplir para ser procesados.
  4. Definiciones: Permiten definir variables dentro de la comprensión for.

Sintaxis Básica

La sintaxis básica de una comprensión for en Scala es la siguiente:

for (element <- collection) yield expression
  • element <- collection: Es un generador que itera sobre cada elemento de la colección.
  • yield expression: Produce una nueva colección basada en la expresión aplicada a cada elemento.

Ejemplo Básico

val numbers = List(1, 2, 3, 4, 5)
val doubled = for (n <- numbers) yield n * 2
println(doubled) // List(2, 4, 6, 8, 10)

En este ejemplo, doubled es una nueva lista que contiene cada número de la lista original multiplicado por 2.

Uso de Filtros

Los filtros se utilizan para incluir condiciones en la comprensión for. Solo los elementos que cumplen con la condición se procesan.

Ejemplo con Filtros

val numbers = List(1, 2, 3, 4, 5)
val evenNumbers = for (n <- numbers if n % 2 == 0) yield n
println(evenNumbers) // List(2, 4)

En este ejemplo, evenNumbers es una nueva lista que contiene solo los números pares de la lista original.

Definiciones en Comprensiones For

Las definiciones permiten declarar variables dentro de la comprensión for.

Ejemplo con Definiciones

val numbers = List(1, 2, 3, 4, 5)
val result = for {
  n <- numbers
  squared = n * n
} yield squared
println(result) // List(1, 4, 9, 16, 25)

En este ejemplo, squared es una variable definida dentro de la comprensión for que contiene el cuadrado de cada número.

Comprensiones For Anidadas

Las comprensiones for pueden anidarse para trabajar con colecciones de colecciones.

Ejemplo de Comprensiones For Anidadas

val matrix = List(
  List(1, 2, 3),
  List(4, 5, 6),
  List(7, 8, 9)
)
val flattened = for {
  row <- matrix
  element <- row
} yield element
println(flattened) // List(1, 2, 3, 4, 5, 6, 7, 8, 9)

En este ejemplo, flattened es una lista que contiene todos los elementos de la matriz original en una sola lista.

Ejercicios Prácticos

Ejercicio 1: Filtrar y Transformar

Dada una lista de números, filtra los números impares y luego multiplica cada número impar por 3.

val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = for (n <- numbers if n % 2 != 0) yield n * 3
println(result) // List(3, 9, 15, 21, 27)

Ejercicio 2: Generar Pares Ordenados

Dadas dos listas de números, genera una lista de pares ordenados (tuplas) donde el primer elemento es de la primera lista y el segundo elemento es de la segunda lista.

val list1 = List(1, 2, 3)
val list2 = List(4, 5, 6)
val pairs = for {
  a <- list1
  b <- list2
} yield (a, b)
println(pairs) // List((1,4), (1,5), (1,6), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6))

Ejercicio 3: Filtrar y Transformar con Definiciones

Dada una lista de números, filtra los números mayores que 5 y luego calcula el cuadrado de cada número filtrado.

val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = for {
  n <- numbers if n > 5
  squared = n * n
} yield squared
println(result) // List(36, 49, 64, 81, 100)

Conclusión

Las comprensiones for en Scala son una herramienta poderosa para trabajar con colecciones de manera concisa y expresiva. Permiten generar nuevas colecciones aplicando transformaciones, filtros y definiciones de manera clara y legible. Practicar con comprensiones for te ayudará a escribir código más limpio y eficiente en Scala.

En el próximo módulo, exploraremos el manejo de errores en la programación funcional, un aspecto crucial para escribir código robusto y confiable.

© Copyright 2024. Todos los derechos reservados