also în Kotlin

Face o acțiune în plus cu un obiect (afișare, verificare, log) și returnează obiectul neschimbat.

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

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ă tot x. Pentru o valoare nouă folosește let.
  • Folosești also pentru setarea proprietăților și scrii it. la fiecare rând. Merge, dar apply e 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.