apply în Kotlin

Configurează un obiect într-un bloc în care obiectul este this, apoi returnează chiar obiectul.

Sintaxă
inline fun <T> T.apply(block: T.() -> Unit): T

Ce face apply

obiect.apply { ... } rulează blocul cu obiectul ca this și apoi returnează obiectul însuși, nu rezultatul blocului. De aceea este folosit pentru a crea și configura un obiect într-un singur loc: setezi proprietăți, adaugi elemente, apoi primești obiectul gata făcut.

Se citește „aplică aceste setări obiectului”. Este des întâlnit cu StringBuilder, cu liste modificabile și cu obiecte care au multe proprietăți var. Pentru o acțiune secundară (afișare, log) în care vrei să numești obiectul it, folosește also.

Parametri

Parametru Descriere
block: T.() -> Unit Blocul de configurare, în care this este obiectul.

Ce returnează

Obiectul pe care a fost apelat (T).

Exemple

Exemplul 1: Crearea și configurarea unui obiect

În bloc scriem direct oras, telefon; apply returnează obiectul, care ajunge în variabila client.

class Client {
    var nume = ""
    var oras = ""
    var telefon = ""
    override fun toString() = "Client($nume, $oras, $telefon)"
}

fun main() {
    val client = Client().apply {
        nume = "Maria Popescu"
        oras = "Cluj-Napoca"
        telefon = "0722111222"
    }
    println(client)
}

Rezultat

Client(Maria Popescu, Cluj-Napoca, 0722111222)

Exemplul 2: apply pe o listă modificabilă

Elementele se adaugă în bloc, iar rezultatul este chiar lista.

fun main() {
    val cumparaturi = mutableListOf<String>().apply {
        add("pâine")
        add("lapte")
        addAll(listOf("mere", "brânză"))
        remove("lapte")
    }
    println(cumparaturi)
    println("${cumparaturi.size} produse")
}

Rezultat

[pâine, mere, brânză]
3 produse

Greșeli frecvente

  • Te aștepți ca apply să returneze ultima expresie din bloc. Returnează obiectul; pentru rezultatul blocului folosește run.
  • Pui în apply logică fără legătură cu obiectul. Folosește-l pentru configurare; pentru alte acțiuni, cod obișnuit sau also.

Comenzi înrudite

  • also: Face o acțiune în plus cu un obiect (afișare, verificare, log) și returnează obiectul neschimbat.
  • run: Rulează un bloc în care obiectul este this și returnează rezultatul blocului; with face același lucru, dar primește obiectul ca argument.
  • buildString: buildString construiește un text din bucăți cu append și appendLine, apoi îl returnează ca String.