Uso de funciones de alcance en Kotlin

Kailash Vaviya 15 febrero 2024
  1. Funciones de alcance en Kotlin
  2. Usar funciones de alcance en Kotlin
  3. Use la función de alcance also en Kotlin
  4. Use la función de alcance let en Kotlin
  5. Use la función de alcance apply en Kotlin
  6. Use la función de alcance run en Kotlin
  7. Use la función de alcance with en Kotlin
Uso de funciones de alcance en Kotlin

Este artículo discutirá la función de alcance also en Kotlin. También repasaremos las otras funciones de alcance disponibles en Kotlin.

Pero primero, comprendamos qué son las funciones de alcance.

Funciones de alcance en Kotlin

Kotlin tiene muchas funciones creadas únicamente para ejecutar una pieza de código en el contexto de un objeto. Estas funciones se denominan funciones de alcance.

Las funciones de ámbito crean un ámbito temporal para el objeto cuando las llamamos con una expresión lambda. Hay 5 funciones de alcance en Kotlin, a saber, also, let, apply, run y with.

Si bien todas las funciones de alcance en Kotlin realizan la misma función, la diferencia es cómo el objeto dentro de ese bloque está disponible después de la ejecución. Según el valor de retorno y la referencia del objeto, debemos elegir una de las cinco funciones de alcance.

La siguiente tabla muestra la referencia de objeto y el valor de retorno de cada función de alcance.

Función de alcance Referencia de objeto Valor de retorno Función de extensión
also it Valor Lambda Es una función de extensión.
let this Valor Lambda Es una función de extensión.
apply - Valor Lambda No es una función de extensión.
run this Valor Lambda No es una función de extensión.
run this Objeto de contexto Es una función de extensión.
with it Objeto de contexto Es una función de extensión.

Usar funciones de alcance en Kotlin

El siguiente ejemplo demuestra el uso de funciones de alcance en Kotlin. En este código, usaremos la función let para crear el alcance del objeto Estudiantes.

data class Student(var firstName: String, var lastName: String, var age: Int, var address: String) {
    fun moving(newAddress: String) { address = newAddress }
    fun ageIncrease() { age++ }
}

fun main() {
    Student("David", "Miller", 24, "New York").let {
        println(it)
        it.moving("Chicago")
        it.ageIncrease()
        println(it)
    }
}

Producción:

Uso de las funciones scope de Kotlin

La función de ámbito se refiere al objeto Estudiante como eso en la salida. Sin usar la función de alcance, habríamos tenido que declarar una nueva variable e inicializarla con el valor del objeto Student para acceder a ella.

Use la función de alcance also en Kotlin

Como se menciona en la tabla anterior, la función also en Kotlin proporciona un objeto de contexto como argumento (it). Podemos usar also cuando necesitamos realizar acciones que toman el objeto de contexto como argumento de cualquier función.

Otra excelente manera de usar also en Kotlin es cuando necesitamos una referencia directa al objeto en sí y no a sus propiedades o función. Considere el siguiente ejemplo para comprender la función also en Kotlin.

fun main() {
    val numList = mutableListOf("one", "three", "five")
    numList
        .also { println("Elements in the list before adding a new one: $it") }
        .add("seven")
        println("Elements in the list after adding a new one: " + numList)
}

Producción:

Usar la función de alcance also en Kotlin

Use la función de alcance let en Kotlin

La función de alcance let en Kotlin proporciona el objeto de contexto como un argumento it. Su valor devuelto es el resultado de la ejecución de lambda.

Podemos usar la función let para invocar múltiples funciones para acumular resultados de cadenas de llamadas.

fun main() {
    val numList = mutableListOf("one", "three", "five", "seven", "nine")
    val resList = numList.map { it.length }.filter { it > 3 }
    println(resList)
}

Producción :

[5,4,5,4]

En lugar de usar resList en el ejemplo anterior, podemos usar la función de alcance let para imprimir los resultados lambda.

fun main() {
    val numList = mutableListOf("one", "three", "five", "seven", "nine")
    numList.map { it.length }.filter { it > 3 }.let{
        println(it)
        //We can add more functions here
    }
}

Producción :

[5,4,5,4]

Si el código tiene solo una función, podemos reemplazar la lambda (it) con el símbolo de referencia del método (::).

fun main() {
    val numList = mutableListOf("one", "three", "five", "seven", "nine")
    numList.map { it.length }.filter { it > 3 }.let(::println)
}

Producción :

[5,4,5,4]

Use la función de alcance apply en Kotlin

Cuando se usa la función apply en Kotlin (this), el objeto de contexto está disponible como receptor. Podemos usar la función apply en bloques de código que no tienen ningún valor de retorno.

El caso de uso más común es durante la configuración de objetos. Considere el siguiente ejemplo donde creamos un objeto Estudiante y luego lo configuramos.

data class Student(var Name: String, var age: Int = 0, var address: String = "")

fun main() {
    val david = Student("David Miller").apply {
        age = 24
        address = "New York"
    }
    println(david)
}

Producción:

Use la función de aplicación de alcance en Kotlin

Use la función de alcance run en Kotlin

Obtenemos el objeto de contexto como el receptor (this) mientras usamos la función run en Kotlin. El resultado de la ejecución de lambda es en sí mismo el valor de retorno de esta función de ámbito.

La función run es más útil cuando lambda tiene tanto la inicialización del objeto como el cálculo del valor de retorno.

class port(var url: String, var portNum: Int) {
    fun initialRequest(): String = "Initial default request"
    fun res(request: String): String = "This is the result of query '$request'"
}

fun main() {

    val portService = port("https://example.kotlinlang.org", 80)

    val finalResult = portService.run {
        portNum = 8080
        res(initialRequest() + " to port $portNum")
    }
    // the same code written with let() function:
    val letResult = portService.let {
        it.portNum = 8080
        it.res(it.initialRequest() + " to port ${it.portNum}")
    }
    println(finalResult)
    println(letResult)
}

Producción:

Usar ejecutar la función de alcance en Kotlin

También podemos usar ejecutar en Kotlin como una función sin extensión. Esto significa que ejecutará un bloque de declaraciones que requiere expresiones.

fun main() {
    val hexNum = run {
        val dig = "0-9"
        val hexDig = "A-Fa-f"
        val indication = "+-"
        Regex("[$indication]?[$dig$hexDig]+")
    }
    for (match in hexNum.findAll("+139 -ABFF 79")) {
        println(match.value)
    }
}

Producción :

+139
-ABFF
79

Use la función de alcance with en Kotlin

La función with también es una función sin extensión, como run. Lo que pasa con la función with es que se pasa como argumento pero está disponible como receptor.

El with se usa mejor para llamar a funciones en el objeto de contexto donde no queremos proporcionar los resultados lambda.

fun main() {
    val num = mutableListOf("one", "three", "five", "seven")
    with(num) {
        println("The function 'with' is called with argument $this")
        println("The function contains $size items")
    }
}

Producción:

Usar con la función de alcance en Kotlin

Kailash Vaviya avatar Kailash Vaviya avatar

Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.

LinkedIn

Artículo relacionado - Kotlin Function