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)
Introducci贸n a Kotlin
Introducci贸n al Curso de Kotlin
Qu茅 es Kotlin
Qu茅 es la Java Virtual Machine
Configuraci贸n del entorno
Instalaci贸n de IntelliJ
Instalaci贸n de IntelliJ en Linux
Kotlin con Visual Studio Code
Hola mundo Kotlin
Hola mundo con Kotlin
Variables en Kotlin
Kotlin y sus tipos de variables
Modificadores y tipos de datos en Kotlin
Operaciones con los tipos de datos en Kotlin
Kotlin y la programaci贸n funcional
Estructuras de control: if
Estructuras de Control: when
Conceptos b谩sicos de Kotlin
Bucles: While y Do While
Ciclos
Null-Safety en Kotlin
Valores nulos, Double bang y c贸mo solucionarlos.
Try Catch
Elvis operator
Collections en Kotlin
Listas
Como ordenar listas con las funciones que tiene Kotlin
Maps
Sets
Libera el potencial de las funciones
驴Qu茅 son las funciones?
Funciones y funciones de extensi贸n
Tipos de par谩metros en las funciones
Lambdas
High Order functions
Scope functions
Let
With
Run
Apply
Also
Proyecto: Bola 8 m谩gica
Creando el men煤 de nuestra bola m谩gica
Contestando aleatoriamente
驴C贸mo continuar tu camino en Kotlin?
No tienes acceso a esta clase
隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera
Aportes 8
Preguntas 3
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.
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")
}
}
Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.