{"id":359,"date":"2023-09-05T09:52:17","date_gmt":"2023-09-05T09:52:17","guid":{"rendered":"http:\/\/javigomez.org\/?p=359"},"modified":"2025-09-29T20:34:09","modified_gmt":"2025-09-29T20:34:09","slug":"05-kotlin-lambdas-try-catch-y-otros-temas-avanzados","status":"publish","type":"post","link":"https:\/\/javigomez.org\/index.php\/2023\/09\/05\/05-kotlin-lambdas-try-catch-y-otros-temas-avanzados\/","title":{"rendered":"05. Kotlin &#8211; Lambdas, Try..Catch y otros temas avanzados"},"content":{"rendered":"\n<p><strong>1. Funciones de Extensi\u00f3n<\/strong><\/p>\n\n\n\n<p>Las funciones de extensi\u00f3n son una caracter\u00edstica poderosa que te permite agregar nuevas funciones a las clases existentes sin modificar su c\u00f3digo fuente original. Las funciones de extensi\u00f3n permiten extender las capacidades de una clase sin tener que heredar de ella o modificar directamente su implementaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun String.saludo() {\n    println(\"\u00a1Hola, $this!\")\n}\nfun main() {\n    val nombre = \"Juan\"\n    nombre.saludo() \/\/ Imprime \"\u00a1Hola, Juan!\"\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>class cli(val nombre:String){\n    fun saludo(){\n        println(this.nombre)\n    }\n\n}\n\nfun cli.saludoPlus(){\n    println(\"Hola ${this.nombre}\")\n}\n\n\nfun main(){\n    var a=cli(\"Javi\")\n    a.saludo()\n    a.saludoPlus()\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>fun String.repetirVeces(veces: Int): String {\n    return this.repeat(veces)\n}\n\nfun main() {\n    val texto = \"Hola\"\n    val resultado = texto.repetirVeces(3)\n    println(resultado) \/\/ Imprime \"HolaHolaHola\"\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 01 Funciones Extension\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/HEAubPK__DM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>2. Funciones de orden superior<\/strong><\/p>\n\n\n\n<p>Las funciones de orden superior son funciones que pueden recibir funciones como par\u00e1metros o devolver funciones como resultado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun suma(a: Int, b: Int): Int {\n    return a + b\n}\n\nfun multiplicacion(a: Int, b: Int): Int {\n    return a * b\n}\n\nfun main() {\n    val resultadoSuma = operar(2, 3, ::suma) \/\/ Pasando la funci\u00f3n suma como argumento\n    println(resultadoSuma) \/\/ Imprime 5\n\n    val resultadoMultiplicacion = operar(4, 5, ::multiplicacion) \/\/ Pasando la funci\u00f3n multiplicacion como argumento\n    println(resultadoMultiplicacion) \/\/ Imprime 20\n}\n<\/code><\/pre>\n\n\n\n<p><strong>3. Lambdas<\/strong><\/p>\n\n\n\n<p>Las lambdas son funciones an\u00f3nimas que se pueden utilizar como argumentos en las funciones de orden superior.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private fun calculadora(n1: Int, n2: Int, fn: (Int, Int) -&gt; Int): Int {\n    return fn(n1, n2)\n}\n\nfun multiplica(a: Int, b: Int): Int {\n    return a * b\n}\n\nfun main() {\n    println(\"La operacion 80 * 20 es: ${calculadora(80, 20, ::multiplica)}\")\n\n    var funcion = { x: Int, y: Int -&gt; x + y }\n    println(\"la operacion de 80 y 20 es: ${calculadora(80, 20, funcion)}\")\n\n    funcion = { x: Int, y: Int -&gt; x - y }\n    println(\"la operacion de 80 y 20 es: ${calculadora(80, 20, funcion)}\")\n\n    println(\"la operacion de 80 y 20 lambda: ${calculadora(80, 20, { x: Int, y: Int -&gt; x + y })}\")\n    println(\"la operacion de 80 y 20 lambda: ${calculadora(80, 20, { x: Int, y: Int -&gt; x - y })}\")\n\n    println(\"La potencia de 2 elevado a 5 con lambda es ${\n        calculadora(2, 5,\n            { x, y -&gt;\n                var valor = 1\n                for (i in 1..y) valor *= x\n                valor\n            }\n        )\n    }\")\n\n    println(\"La potencia de 2 elevado a 5 con lambda es ${\n        calculadora(2, 5)\n        { x, y -&gt;\n            var valor = 1\n            for (i in 1..y) valor *= x\n            valor\n        }\n    }\")\n}\n<\/code><\/pre>\n\n\n\n<p>La variable it es una forma abreviada de referirse a un \u00fanico par\u00e1metro en una lambda cuando solo se tiene un par\u00e1metro. Es \u00fatil cuando la lambda solo toma un par\u00e1metro y no se especifica un nombre para ese par\u00e1metro.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun calcula(x: Int,op: (Int)-&gt;Int):Int{\n    return op(x)\n}\n\nfun main() {\n    val cua: (Int) -&gt; Int = { it * it }\n    println(calcula(4,cua))\n\n    val numeros = listOf(1, 2, 3, 4, 5)\n    println(numeros)\n\n    val numerosPares = numeros.filter { it % 2 == 0 }\n    println(numerosPares)\n}\n<\/code><\/pre>\n\n\n\n<p>Aqu\u00ed tienes un ejemplo que ilustra el acceso a variables externas mutables<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun main() {\n    var contador = 0\n    val incrementar: () -&gt; Unit = { contador++ }\n    \n    incrementar()\n    println(contador) \/\/ Imprime 1\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 03 Lambda\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/g6U85zrLxSI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>4. Alias (typealias)<\/strong><\/p>\n\n\n\n<p>typealias se utiliza para proporcionar un nombre alternativo o alias a un tipo existente<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>typealias EnteroDeDosBytes = Short\n\nfun main() {\n    val numero: EnteroDeDosBytes = 32767\n    println(numero) \/\/ Imprime 32767\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 04 Typealias\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/epYxx-glzqE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>5. Desestructuraci\u00f3n<\/strong><\/p>\n\n\n\n<p>La desestructuraci\u00f3n es una caracter\u00edstica en Kotlin que permite descomponer los objetos en sus componentes individuales y asignarlos a variables individuales.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>data class Persona(val nombre: String, val edad: Int)\n\nfun main() {\n    val persona = Persona(\"Juan\", 30)\n    val (nombre, edad) = persona \/\/ Desestructuraci\u00f3n\n\n    println(\"Nombre: $nombre\")\n    println(\"Edad: $edad\")\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 05 Desestructuracion\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/7bvEmlnRwhA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>6. Try&#8230;Catch<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun main() {\n    try {\n        \/\/ C\u00f3digo que puede generar una excepci\u00f3n\n        val resultado = dividir(10, 0)\n        println(\"Resultado: $resultado\")\n    } catch (e: ArithmeticException) {\n        \/\/ Captura la excepci\u00f3n espec\u00edfica\n        println(\"Error: ${e.message}\")\n    } finally {\n        \/\/ C\u00f3digo que se ejecuta siempre, independientemente de si hay una excepci\u00f3n o no\n        println(\"Operaci\u00f3n finalizada\")\n    }\n}\n\nfun dividir(a: Int, b: Int): Int {\n    return a \/ b\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>fun main() {\n    try {\n        dividir(10, 0)\n    } catch (e: ArithmeticException) {\n        println(\"Error: ${e.message}\")\n    }\n}\n\nfun dividir(a: Int, b: Int): Int {\n    if (b == 0) {\n        throw ArithmeticException(\"Divisi\u00f3n por cero no permitida\")\n    }\n    return a \/ b\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>class ErrorMio(msg:String):Exception(msg)\n\n    fun main() {\n        try {\n            dividir(10, 0)\n        } catch (e: ErrorMio) {\n            println(\"Error: ${e.message}\")\n        }\n    }\n\n    fun dividir(a: Int, b: Int): Int {\n        if (b == 0) {\n            throw ErrorMio(\"Divisi\u00f3n por cero no permitida\")\n        }\n        return a \/ b\n    }\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 06 TryCatch\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/NLXH6bP4ZfY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>7. Scope Functions<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>data class Persona(var nombre: String, var edad: Int)\n\n fun main() {\n        val persona = Persona(\"John Doe\", 30)\n\n        \/\/ Ejemplo de uso de let\n        val resultadoLet = persona.let {\n            it.nombre = it.nombre.uppercase()\n            it.edad += 1\n            it.edad * 2\n        }\n        println(\"Resultado let: $resultadoLet\") \/\/Resultado let: 62\n        println(\"Persona: $persona\") \/\/Persona: Persona(nombre=JOHN DOE, edad=31)\n\n        val persona2 = Persona(\"John Doe\", 30)\n        \/\/ Ejemplo de uso de apply\n        val resultadoApply = persona2.apply {\n            nombre = nombre.uppercase()\n            edad += 1\n        }\n        println(\"Resultado apply: $resultadoApply\") \/\/Resultado apply: Persona(nombre=JOHN DOE, edad=31)\n        println(\"Persona2: $persona2\") \/\/Persona2: Persona(nombre=JOHN DOE, edad=31)\n    }\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 07 ScopeFunctions\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/R8IzChMpXzk?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>8. Operador Elvis<\/strong><\/p>\n\n\n\n<p>El operador Elvis en Kotlin es representado por ?:. Se utiliza para proporcionar un valor predeterminado o alternativo en caso de que una expresi\u00f3n sea nula.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> fun main() {\n        val nombre: String? = null\n        val nombrel = nombre?.length ?: 0\n        println(\"Longitud del nombre: $nombrel\") \/\/Longitud del nombre: 0\n\n\n        val apellido: String? = \"G\u00f3mez\"\n        val apellidol = apellido?.length ?: 0\n        println(\"Longitud del apellido: $apellidol\") \/\/Longitud del apellido: 5\n    }\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 08 Elvis\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/zXq8BAR3l-Q?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>9. Lateinit y Lazy<\/strong><\/p>\n\n\n\n<p>Tanto lateinit como lazy son mecanismos que te permiten diferir la inicializaci\u00f3n de propiedades hasta que sean necesarias.<\/p>\n\n\n\n<p><strong>lateinit<\/strong>:<\/p>\n\n\n\n<p>Se utiliza cuando sabes que una propiedad ser\u00e1 inicializada antes de su primer uso y quieres evitar la necesidad de asignar un valor inicial inmediato o utilizar un modificador nullable (var prop: Tipo?).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MiClase {\n    lateinit var nombre: String\n\n    fun inicializarNombre() {\n        nombre = \"John Doe\"\n    }\n\n    fun imprimirNombre() {\n        println(nombre)\n    }\n}\n\nfun main() {\n    val objeto = MiClase()\n    objeto.inicializarNombre()\n    objeto.imprimirNombre()\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 09 LateInit\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/76w8b6ggdU8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><strong>lazy<\/strong>:<\/p>\n\n\n\n<p>Se utiliza cuando deseas inicializar una propiedad perezosamente, es decir, su valor se calcula solo cuando se accede a ella por primera vez.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>val miPropiedad: String by lazy {\n    println(\"Calculando valor...\")\n    \"Mi valor\"\n}\n\nfun main() {\n    println(miPropiedad)\n    println(miPropiedad)\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Kotlin U05 10 Lazy\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/7U0isc-ni-Q?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>1. Funciones de Extensi\u00f3n Las funciones de extensi\u00f3n son una caracter\u00edstica poderosa que te permite agregar nuevas funciones a las clases existentes sin modificar su &hellip; <\/p>\n","protected":false},"author":1,"featured_media":347,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[168,169,214,215,216,245,296,297,334,336],"class_list":["post-359","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kotlin","tag-funciones-de-extension","tag-funciones-de-orden-superior","tag-lambdas","tag-lateinit","tag-lazy","tag-operador-elvis","tag-scope-fucntions","tag-scope-functions","tag-try-catch","tag-typealias"],"_links":{"self":[{"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/posts\/359","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/comments?post=359"}],"version-history":[{"count":1,"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/posts\/359\/revisions"}],"predecessor-version":[{"id":942,"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/posts\/359\/revisions\/942"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/media\/347"}],"wp:attachment":[{"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/media?parent=359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/categories?post=359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/javigomez.org\/index.php\/wp-json\/wp\/v2\/tags?post=359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}