#Kata For-Loops en Scala.

En este post voy a explicarte como se escriben los ciclos for en Scala y te mostraré algunas variantes.

Primeros pasos.

El ciclo for es una estructura de control que permite repetir acciones, este es parte del paradigma de programación estructurado y existe prácticamente en todos los lenguajes. Esta estructura se ejecutará N veces  de acuerdo a las condicionales introducidas.

En Scala, el ciclo for recorre una colección, no realiza incrementos o decrementos, ni tampoco revisa las condicionales. Se parece más a la estructura de control  foreach, que a la estructura de control for de los lenguajes de sintaxis C.

//iterating a list
var list = List(1, -2, 3)
for(item <- list) println(item)
//iterating a range declared outside
var decimalRange = BigDecimal(0.0) to BigDecimal(1.0) by .01
for(item <- decimalRange) println(item)
//iterating a range declared inside
for(item <- 0 to 10 by 2) println(item)
view raw for1.sc hosted with ❤ by GitHub

Filtros.

Puedes especificar filtros en tu ciclo for. Después de especificar la colección, agregas  «;»  con una sentencia if. Solo se iterará sobre los elementos que cumplan las condiciones.

 

var sequence = 1 to 30
sequence.foreach(println)
def isDivisibleBy3(input:Int) = { input % 3 == 0 }
def isDivisibleBy5(input:Int) = {input % 5 == 0 }
for(item <- sequence; if isDivisibleBy5(item) ; if isDivisibleBy3(item)) {
println(item)
}
view raw for2.sc hosted with ❤ by GitHub

Yield.

Por defecto, la instrucción for no retorna ningún valor. Bueno, si lo hace, pero es un valor de tipo Any. Si requieres que la estructura de control retorne una colección, tendrás que especificarlo con la palabra reservada yield. La estructura del ciclo for también cambiará un poco.

var sequence = 1 to 30
sequence.foreach(println)
def isDivisibleBy3(input:Int) = { input % 3 == 0 }
// for without yield
for(item <- sequence; if isDivisibleBy3(item)) {
println(item)
}
//for with yield
var forResult = for{ item <- sequence if isDivisibleBy3(item) } yield item
forResult.foreach(println)
view raw for2.sc hosted with ❤ by GitHub

For vs foreach.

For y foreach no juegan en la misma liga. El primero es una estructura de control y el segundo únicamente es un método auxiliar de las colecciones. For puede realizar ciertas optimizaciones en las iteraciones y foreach nada más crea una función anónima adicional;  foreach no retorna ningún valor, for si puede hacerlo con yield.

var sequence = 1 to 30
sequence.foreach(println)
def isDivisibleBy3(input:Int) = { input % 3 == 0 }
//for with yield is a variable
var forResult = for{ item <- sequence if isDivisibleBy3(item) } yield item
// forResult is a Vector, a collection
println(forResult)
// foreachResult is Unit, not a collection
var foreachResult:Unit = forResult.foreach(println)
println(foreachResult)
view raw for3.sc hosted with ❤ by GitHub

Gustavo Sánchez

Soy especialista en escribir software de calidad. Mediante el uso de marcos de trabajo, técnicas y automatización de procesos he podido reducir los costes operativos de los sistemas de la empresa. Sistemas confiables y adaptables producen clientes felices.

Site Footer