Uso avanzado de loops y loops por comprensión
Me costo mucho buscar la traducción de “for Comprehensions” por lo tanto decidí poner “por comprensión”. Si le parece mal me avisan y lo cambio.
Como vimos el operador for es mucho más rico en scala que en java o C.
Se puede tener múltiples generadores de la forma variable <- expresión separados por ;
for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + " ")
// Prints 11 12 13 21 22 23 31 32 33
cada generador puede tener su condición:
for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
// Prints 12 13 21 23 31 32
También se puede usar n cantidad de variables:
for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
// Prints 13 22 23 31 32 33
Con la palabra yield se puede retornar una colección que este formada por el resultado de cada iteración:
for (i <- 1 to 10) yield i % 3
// Yields Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)
Este tipo de loops se denominan “por compresión”. De esta forma podemos generar diferentes colecciones:
for (c <- "Hello"; i <- 0 to 1) yield (c + i).toChar
// Yields "Hieflmlmop"
for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
// Yields Vector('H', 'e', 'l', 'l', 'o', 'I', 'f', 'm', 'm', 'p')
En el ejemplo podemos ver que la lista generada es compatible con la primer variable que se itera.