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
applysă returneze ultima expresie din bloc. Returnează obiectul; pentru rezultatul blocului foloseșterun. - 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.