Saltar a contenido

1.6 Bucles: for y forEach

Un bucle repite un bloque de código. En Kotlin hay dos formas muy usadas de recorrer valores: el for sobre un rango o colección y el método forEach.

Versión 1: for donde se ve de dónde sale cada cosa

fun main() {
    for (i in 1..5) {
        println("Número: $i")
    }
}
Parte Qué hace
i La variable que toma un valor distinto en cada vuelta
in "dentro de"
1..5 De dónde sale: el rango de 1 a 5, ambos incluidos
{ ... } Lo que se repite

Versión 2: sin for completo, con forEach

fun main() {
    val rango = 1..5

    rango.forEach { numero ->
        // Bloque que se ejecuta por cada elemento
        println("Número actual: $numero")

        if (numero % 2 == 0) {
            println("  -> $numero es par")
        } else {
            println("  -> $numero es impar")
        }
    }

    // También se puede usar el parámetro implícito 'it'
    println("\n--- Usando 'it' ---")
    rango.forEach {
        println("Elemento: $it")
    }
}

Comparación rápida

Característica for (i in rango) rango.forEach { }
Estilo Imperativo (tradicional) Funcional (lambda)
break / continue ✅ Sí ❌ No directamente
Retorno de valor ❌ No ✅ Puede devolver algo
Legibilidad Muy clara para bucles simples Mejor para operaciones encadenadas

Variantes

fun main() {
    // Rango descendente
    for (i in 5 downTo 1) println(i)

    // Con paso (step)
    for (i in 1..10 step 2) println(i)

    // Excluyendo el último valor
    for (i in 1 until 5) println(i)

    // Iterar sobre una lista
    val nombres = listOf("Ana", "Luis", "Eva")
    for (nombre in nombres) println(nombre)

    // Iterar con índice
    for ((indice, nombre) in nombres.withIndex()) {
        println("$indice: $nombre")
    }
}

Cortar un bucle con una variable de control

Una forma sencilla de parar un bucle sin break: una variable booleana (una bandera) que el bucle consulta en su condición. Cuando pasa lo que buscas, la pones en false.

fun main() {
    var activo = true
    var i = 1

    while (activo) {
        println(i)
        if (i == 5) {
            activo = false // se cumple la condición: el bucle se detiene
        }
        i++
    }
}

Con do-while, que se ejecuta al menos una vez:

fun main() {
    var activo = true
    var intentos = 0

    do {
        intentos++
        println("Intento $intentos")
        if (intentos == 3) {
            activo = false
        }
    } while (activo)
}
Opcional: break y continue

Existen, pero no son imprescindibles: casi siempre se puede escribir lo mismo con una variable de control.

fun main() {
    for (i in 1..10) {
        if (i == 3) continue // salta esta vuelta
        if (i == 6) break    // sale del bucle
        println(i)           // 1, 2, 4, 5
    }
}

while y do-while

fun main() {
    var cuenta = 3
    while (cuenta > 0) {   // comprueba antes
        println(cuenta--)
    }
}