Escapar del bucle con break y continue



Hasta ahora hemos visto estructuras condicionales y repetitivas para controlar el flujo de un programa, pero otra forma de gestionar la secuencia de un programa es través de saltos o interrupciones de ciertos bloques de código. Kotlin tiene tres expresiones principales para romper la estructura secuencial de un programa provocando saltos en la estructura del código:
  • return: en general sale de una función y retorna un valor.
  • break:  detiene la ejecución de un bucle y sale de él, por lo que no se ejecuta el código que se encuentre después en el cuerpo de ese bucle.
  • continue: interrumpe una iteración dentro de un bucle (normalmente en base a una condición específica), y vuelve al principio del bucle para realizar otra iteración, si corresponde.
Ahora nos vamos a centrar en las dos últimas expresiones y en su uso en los bucles, y dejaremos return para cuando veamos las funciones.

Por ejemplo, podemos detener un bucle en base a una condición:
for (i in 1..10) {
    if (i > 5) {
        break // detiene el bucle
    }
    print("$i ") // 1 2 3 4 5
}
Con este otro ejemplo solo interrumpimos el bucle para los números pares y así obtenemos los números impares del 1 al 10:
for (i in 1..10) {       
    if (i % 2 == 0) {
        continue  // vuelve al inicio del bucle
    }
    print("$i ") // 1 3 5 7 9
}
Por otra parte, Kotlin permite marcar cualquier expresión con una etiqueta que tienen la forma de un identificador seguido del signo @. Más claro con un ejemplo: en el siguiente código tenemos un bucle for que imprime del 1 al 10:
for (i in 1..10) {
    print("$i ")
}
Podemos etiquetar la expresión anterior de la siguiente manera:
bucle@ for (i in 1..10) {
    print("$i ")
}
Comprobamos que los dos códigos anteriores tienen el mismo resultado, pero el segundo nos permite calificar las instrucciones break y continue con la etiqueta que hace referencia al bucle, y así podemos especificar a qué expresión se refiere en caso de que break o continue estén contenidas en bloques anidados de más de un bucle:
bucle1@ for (i in 1..4) {

    bucle2@ for (j in 1..2) {
        println("i = $i; j = $j")
        if (i == 2)
            break@bucle1
    }
}
Puedes comprobar que el resultado de ejecutar este código cambia al cambiar la etiqueta de break a break@bucle2 (aunque como break termina por defecto con el bucle más interno, no sería necesario calificar a break con la etiqueta bucle2). Un ejemplo de continue con una etiqueta:
externo@ for (i in 1..5) {
    for (j in 1..4) {
        if (i == 3 || j == 2)
            continue@externo
        println("i = $i; j = $j")
    }
}

Comentarios

Entradas populares

I/O: entrada y salida de datos en consola

Recursos gratis para aprender Kotlin

Lectura y escritura de archivos