let în Kotlin

Rulează un bloc de cod cu valoarea ca parametru it și returnează rezultatul blocului; des folosit cu ?. pentru valori null.

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

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 let fără ?. pe o valoare care poate fi null: x.let { } nu compilează pentru String? dacă în bloc apelezi metode fără ?. Scrie x?.let { }.
  • Te aștepți ca let să returneze obiectul inițial. Returnează ultima expresie din bloc; dacă blocul se termină cu println, rezultatul este Unit. Pentru obiectul inițial folosește also.
  • Scrii lanțuri lungi de let imbricate cu it peste 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.