Ce face let
let este una dintre cele cinci scope functions. Scrii valoare.let { ... }: în bloc, valoarea se numește it (sau cum vrei tu: { x -> ... }), iar let returnează ultima expresie din bloc.
Cea mai frecventă folosire este împreună cu apelul sigur ?.: email?.let { trimite(it) } rulează blocul doar dacă email nu este null, iar în bloc it are tipul fără ?. Dacă valoarea este null, tot rezultatul este null; poți adăuga ?: pentru o valoare implicită.
Mai este folosit pentru a transforma o valoare într-un lanț de apeluri sau pentru a limita o variabilă temporară la un bloc mic. Diferențele față de celelalte: run folosește this în loc de it, iar also și apply returnează obiectul inițial, nu rezultatul blocului.
Parametri
| Parametru | Descriere |
|---|---|
block: (T) -> R |
Blocul de cod. Primește valoarea ca parametru (implicit it); ultima lui expresie este rezultatul. |
Ce returnează
Rezultatul blocului (ultima expresie). Cu ?.let: null dacă valoarea era null.
Exemple
Exemplul 1: let cu ?. pentru o valoare care poate lipsi
Blocul rulează doar pentru valori diferite de null. Pentru null, operatorul ?: dă textul implicit.
fun descriere(telefon: String?): String =
telefon?.let { "Telefon: ${it.length} cifre, începe cu ${it.take(3)}" } ?: "Fără telefon"
fun main() {
println(descriere("0744123456"))
println(descriere(null))
val email: String? = "ana@exemplu.ro"
email?.let { println("Trimit mesaj la $it") }
}
Rezultat
Telefon: 10 cifre, începe cu 074
Fără telefon
Trimit mesaj la ana@exemplu.ro
Exemplul 2: let returnează rezultatul blocului
Valoarea lui let este ultima expresie din bloc, deci poate avea alt tip decât obiectul de pornire.
fun main() {
val note = listOf(9, 7, 10, 8)
val mesaj = note.let { lista ->
val media = lista.average()
"Media celor ${lista.size} note este $media"
}
println(mesaj)
val lungime = "Timișoara".let { it.length }
println("Lungimea: $lungime")
}
Rezultat
Media celor 4 note este 8.5
Lungimea: 9
Greșeli frecvente
- Folosești
letfără?.pe o valoare care poate fi null:x.let { }nu compilează pentruString?dacă în bloc apelezi metode fără?. Scriex?.let { }. - Te aștepți ca
letsă returneze obiectul inițial. Returnează ultima expresie din bloc; dacă blocul se termină cuprintln, rezultatul esteUnit. Pentru obiectul inițial foloseștealso. - Scrii lanțuri lungi de
letimbricate cuitpeste tot. Codul devine greu de citit; dă nume parametrilor ({ client -> }) sau folosește variabile obișnuite.
Comenzi înrudite
run: Rulează un bloc în care obiectul este this și returnează rezultatul blocului; with face același lucru, dar primește obiectul ca argument.also: Face o acțiune în plus cu un obiect (afișare, verificare, log) și returnează obiectul neschimbat.apply: Configurează un obiect într-un bloc în care obiectul este this, apoi returnează chiar obiectul.takeIf: Returnează obiectul dacă îndeplinește condiția și null altfel; takeUnless face invers.