KotlinIntermedio7 oct 2025

El misterio del lambda que se ejecuta dos veces

snippet.kotlin
fun main() {
    val list = mutableListOf<() -> Unit>()
    list.add { println("Hola") }
    list.forEach { it() }
    println("Tamaño final: ${list.size}")
}

¿Qué crees que imprime?

Salida Esperada

Hola
Tamaño final: 1

⚠️ Salida Real

Hola
Hola
Tamaño final: 2

¿Por qué pasa esto?

**¡Kotlin nos juega una mala pasada!** 😱 Aquí tenemos un **lambda capturador** que se comporta como un boomerang: - El lambda `{ println("Hola") }` captura la referencia a la lista mutable `list` - Al ejecutarse el lambda dentro del `forEach`, **modifica la lista** añadiendo otro lambda - Esto causa que el iterador interno **vuelva a procesar** el nuevo elemento añadido - Resultado: **¡Un bucle inesperado dentro del forEach!** 🔄 **Moraleja**: Nunca modifiques colecciones mientras las iteras, ¡o te encontrarás con sorpresas recursivas! 🤪

Conceptos relacionados

lambda-capturemutation-during-iterationconcurrent-modification