← Scala EspañolChapter 04 of 13

Control de Flujo

## Objetivos de Aprendizaje - Dominar expresiones if/else - Comprender expresiones match (switch de Scala) - Aprender bucles for y comprehensions - Trabajar con bucles while y do-while - Comprender control de bucles (break, continue) ## Expresiones if/else ### if/else Basico ```scala val x = 10 if (x > 0) { println("Positive") } else { println("Non-positive") } ``` ### else if ```scala def grade(score: Int): String = { if (score >= 90) { "A" } else if (score >= 80) { "B" } else if (score >= 70) { "C" } else if (score >= 60) { "D" } else { "F" } } ``` ### if como Expresion En Scala, if/else devuelve un valor: ```scala val max = if (a > b) a else b val sign = if (x > 0) 1 else if (x < 0) -1 else 0 ``` ### Asignacion vs Expresion ```scala var result = "" if (x > 0) { result = "positive" } else { result = "non-positive" } // Equivalente (ternario-like) val result2 = if (x > 0) "positive" else "non-positive" ``` ## Expresiones match ### match Basico ```scala val day = 3 val dayName = day match { case 1 => "Monday" case 2 => "Tuesday" case 3 => "Wednesday" case 4 => "Thursday" case 5 => "Friday" case 6 => "Saturday" case 7 => "Sunday" case _ => "Invalid" } println(dayName) // Wednesday ``` ### match como Expresion ```scala def describe(x: Any): String = x match { case 1 => "one" case "hello" => "greeting" case true => "truth" case List(1, 2, 3) => "list of three numbers" case _ => "something else" } ``` ### Emparejamiento de Patrones con Variables ```scala def describeList(lst: List[Int]): String = lst match { case List() => "empty list" case head :: tail => s"non-empty list starting with $head" case other => s"list with ${other.length} elements" } ``` ### Emparejamiento con Guardas ```scala def grade(score: Int): String = score match { case s if s >= 90 => "A" case s if s >= 80 => "B" case s if s >= 70 => "C" case s if s >= 60 => "D" case _ => "F" } ``` ### Emparejamiento por Tipos ```scala def describe(obj: Any): String = obj match { case i: Int if i > 0 => s"positive integer: $i" case s: String => s"string: $s" case l: List[_] => s"list of length ${l.length}" case _: BigInt => "a big integer" case null => "null" case _ => "something unknown" } ``` ## Bucles for ### Bucle for Basico ```scala for (i <- 1 to 5) { println(i) } // Imprime: 1, 2, 3, 4, 5 ``` ### until vs to ```scala for (i <- 0 until 5) { println(i) } // Imprime: 0, 1, 2, 3, 4 for (i <- 1 to 5) { println(i) } // Imprime: 1, 2, 3, 4, 5 ``` ### Iterando Colecciones ```scala val fruits = List("apple", "banana", "cherry") for (fruit <- fruits) { println(fruit) } // Con indice for (i <- fruits.indices) { println(s"$i: ${fruits(i)}") } ``` ### Multiples Generadores ```scala for (i <- 1 to 3; j <- 1 to 3) { println(s"($i, $j)") } // Con guarda for (i <- 1 to 5; j <- 1 to i) { println(s"$i >= $j") } ``` ### for con Guardas ```scala for (i <- 1 to 100 if i % 3 == 0 if i % 5 == 0) { println(s"FizzBuzz: $i") } // Igual que for (i <- 1 to 100 if i % 15 == 0) { println(s"FizzBuzz: $i") } ``` ## For Comprehensions ### yield ```scala val squares = for (i <- 1 to 5) yield i * i // List(1, 4, 9, 16, 25) val doubled = for (i <- List(1, 2, 3)) yield i * 2 // List(2, 4, 6) ``` ### Transformando Colecciones ```scala case class Person(name: String, age: Int) val people = List( Person("Alice", 30), Person("Bob", 25), Person("Charlie", 35) ) val names = for (p <- people) yield p.name // List("Alice", "Bob", "Charlie") val adults = for (p <- people if p.age >= 30) yield p // List(Person("Alice", 30), Person("Charlie", 35)) ``` ### Comprehensions Anidadas ```scala val matrix = List( List(1, 2, 3), List(4, 5, 6), List(7, 8, 9) ) val flattened = for { row <- matrix element <- row if element % 2 == 0 } yield element // List(2, 4, 6, 8) ``` ## Bucles while ### Bucle while ```scala var i = 0 while (i < 5) { println(i) i += 1 } ``` ### Bucle do-while ```scala var j = 0 do { println(j) j += 1 } while (j < 5) ``` ## Control de Bucles ### break (Scala 2.10+) ```scala import scala.util.control.Breaks._ breakable { for (i <- 1 to 100) { if (i == 10) break println(i) } } ``` ### continue Scala no tiene continue. Usa guardas en su lugar: ```scala for (i <- 1 to 10) { if (i % 2 == 0) { // Procesar numeros pares println(s"Even: $i") } // Los impares se omiten } ``` ## Valores de Retorno ### Retorno de Funciones ```scala def findFirst[T](arr: List[T], predicate: T => Boolean): Option[T] = { for (elem <- arr) { if (predicate(elem)) return Some(elem) } None } ``` ### Retornos Etiquetados ```scala def hasEvenNumber(list: List[Int]): Boolean = { list.foreach { num => if (num % 2 == 0) return true } false } ``` ## Resumen - `if/else` es una expresion que devuelve un valor - `match` es la construccion potente de emparejamiento de patrones de Scala - Los bucles `for` pueden iterar sobre rangos, colecciones y multiples generadores - `yield` transforma resultados en for comprehensions - Las guardas (`if`) filtran iteraciones - `while` y `do-while` estan disponibles para codigo imperativo - Usa `breakable` de `scala.util.control.Breaks` para la funcionalidad de break - Prefiere enfoques funcionales (comprehensions) sobre bucles imperativos cuando sea posible

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →