No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Let

30/37
Recursos

Aportes 8

Preguntas 3

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Siguiendo lo que aprendimos en la clase anterior, no tenemos que repetir el lambda dos veces (aunque entiendo que lo haya hecho as铆 para explciarlo bien)

La Funci贸n let { }
La funci贸n let es una funci贸n que crea un alcance temporal para un objeto en el interior de un bloque de c贸digo.

Esto quiere decir, que puedes referirte al objeto sin usar su nombre debido a que es el par谩metro de la funci贸n lambda pasada a let.

inline fun <T, R> T.let(block: (T) -> R): R

Lenguaje del c贸digo: HTML, XML (xml)
Como vez en su declaraci贸n, let:

  • Es una funci贸n gen茅rica con argumentos T y R

  • Es una funci贸n inline

  • Es una funci贸n de extensi贸n del tipo recibidor T

  • Recibe como par谩metro un tipo funci贸n (T) -> 庐

  • Retorna como resultado a R
    Ya que let ejecuta a block pasando la expresi贸n this del objeto recibidor, es como si crearas un espacio de escritura para tus sentencias asociadas al objeto.

val resultado = objeto.let{
    /* sentencias y retorno de valor */
}

Lenguaje del c贸digo: Kotlin (kotlin)
Ejemplo: Funci贸n let Para Mapear
Supongamos que tenemos una clase para las facturas junto a otra que representa las l铆neas que est谩n en ella:

class InvoiceLine(val unitCost: Double)
class Invoice(val customer: String, val lines: List<InvoiceLine>)

Lenguaje del c贸digo: Kotlin (kotlin)
Ahora deseamos leer una factura y formatear las propiedades de la misma para mostrarlas en pantalla.

fun main() {
    val invoice = Invoice(
        "Fabricia",
        listOf(
            InvoiceLine(5.0),
            InvoiceLine(4.0),
            InvoiceLine(6.0)
        )
    )

    val invoiceDetail = invoice.let {
        val total = it.lines.sumOf { line -> line.unitCost }
        "La factura de ${it.customer} tiene un total de $total"
    }

    println(invoiceDetail)
}

Salida:

La factura de Fabricia tiene un total de 15.0

Como puedes notar, al invocar a invoice.let{}, el par谩metro del lambda ser谩 invoice, por lo que podemos usar a it como referencia.

Con esta forma podemos obtener el total de la factura a trav茅s de it.lines.sumOf{} y construir un String resultante con it.customer.

El objetivo es crear un contexto que te permita mejorar la legibilidad del prop贸sito de tu c贸digo.

Ejemplo: Funci贸n let Y Tipos Anulables
La funci贸n let tambi茅n es de utilidad para ejecutar sentencias sobre tipos anulables en conjunto con el operador de acceso seguro(.?).

Si el objeto recibidor no es null, entonces las sentencias del lambda que pasaste como bloque de c贸digo son ejecutadas, de lo contrario no habr谩 acci贸n.

Por ejemplo, 驴que pasar铆a si la factura le铆da fuese nula e intentaras imprimir su detalle?:

fun main() {
    val invoice: Invoice? = null

    val invoiceDetail = invoice?.let {
        val total = it.lines.sumOf { line -> line.unitCost }
        "La factura de ${it.customer} tiene un total de $total"
    }

    println(invoiceDetail)
}

Resultado:

null

Lenguaje del c贸digo: JavaScript (javascript)
La funci贸n let tratar谩 a invoice como si fuese no aceptara nulos en todo el alcance del lambda, de esta forma te evitas la comprobaci贸n de nulidad en cada l铆nea del bloque de c贸digo.

Y si es null, entonces el par谩metro block de let() no ser谩 ejecutado.

Fuente: https://www.develou.com/la-funcion-let-en-kotlin/

C贸digo de la clase

fun main(args: Array<String>){

    //Let ejecuta c贸digo cuando el valor no es nulo
    var nombre: String? = null
    nombre?.let{
        //C贸digo no se ejecutara al ser la variable nula
        valor -> println("El nombre no es nulo es $valor")
    }

    nombre = "David"
    nombre?.let{
        //C贸digo  se ejecutara
        valor -> println("El nombre no es nulo, es $valor")
    }
}

?.let nos permite correr el c贸digo para un valor que no es nulo


Imprimir los numeros pares usando let

fun main() {
    var numero : Int? = null
    val mensajePar : (Int) -> String = { "$it es par" }

    for (i in (0..20)) {
        if (i % 2 == 0)
            numero = i
        else
            numero = null

        numero?.let {
            println(mensajePar(i))
        }
    }
}
<fun main(args: Array<String>) {
    var nombre: String? = null
    nombre?.let{
        valor -> println("El nombre no es nulo es $valor")
    }
    nombre = "Freddy"
    nombre?.let{
        valor -> println("El nombre no es nulo es $valor")
    }
}> 
fun main(args: Array<String>){

    //Let ejecuta c贸digo cuando el valor no es nulo
    var nombre: String? = null
    nombre?.let{
        //C贸digo no se ejecutara al ser la variable nula
        valor -> println("El nombre no es nulo es $valor")
    }

    nombre = "David"
    nombre?.let{
        //C贸digo  se ejecutara
        valor -> println("El nombre no es nulo, es $valor")
    }
}