Ce face also
obiect.also { ... } rulează blocul cu obiectul ca parametru it și returnează obiectul inițial. Se citește „și, în plus, fă asta”: afișezi o valoare, o scrii într-un log sau o adaugi într-o listă, fără să întrerupi un lanț de apeluri.
Diferența față de apply este doar numele obiectului în bloc: it la also, this la apply. Folosește also când acțiunea folosește obiectul, și apply când îl configurezi.
Parametri
| Parametru | Descriere |
|---|---|
block: (T) -> Unit |
Acțiunea; primește obiectul ca it. |
Ce returnează
Obiectul pe care a fost apelat, neschimbat.
Exemple
Exemplul 1: Afișarea pașilor intermediari dintr-un lanț
also afișează valoarea de la fiecare pas și o lasă să treacă mai departe la următorul apel.
fun main() {
val rezultat = listOf(4, 9, 2, 10, 7)
.also { println("Inițial: $it") }
.filter { it >= 5 }
.also { println("Doar notele de trecere: $it") }
.sorted()
println("Rezultat: $rezultat")
}
Rezultat
Inițial: [4, 9, 2, 10, 7]
Doar notele de trecere: [9, 10, 7]
Rezultat: [7, 9, 10]
Exemplul 2: Salvarea unui obiect nou într-o listă
Funcția creează comanda, o adaugă în istoric cu also și o returnează.
data class Comanda(val numar: Int, val client: String)
val istoric = mutableListOf<Comanda>()
fun comandaNoua(client: String): Comanda =
Comanda(istoric.size + 1, client).also { istoric.add(it) }
fun main() {
val c1 = comandaNoua("Ana")
val c2 = comandaNoua("Ion")
println(c1)
println(c2)
println("În istoric: ${istoric.size} comenzi")
}
Rezultat
Comanda(numar=1, client=Ana)
Comanda(numar=2, client=Ion)
În istoric: 2 comenzi
Greșeli frecvente
- Încerci să schimbi valoarea în also:
x.also { it + 1 }returnează totx. Pentru o valoare nouă foloseștelet. - Folosești also pentru setarea proprietăților și scrii
it.la fiecare rând. Merge, darapplye mai scurt pentru configurare.
Comenzi înrudite
apply: Configurează un obiect într-un bloc în care obiectul este this, apoi returnează chiar obiectul.let: Rulează un bloc de cod cu valoarea ca parametru it și returnează rezultatul blocului; des folosit cu ?. pentru valori null.run: Rulează un bloc în care obiectul este this și returnează rezultatul blocului; with face același lucru, dar primește obiectul ca argument.