takeIf în Kotlin

Returnează obiectul dacă îndeplinește condiția și null altfel; takeUnless face invers.

Sintaxă
inline fun <T> T.takeIf(predicate: (T) -> Boolean): T?
inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T?

Ce face takeIf

valoare.takeIf { conditie } verifică o condiție despre valoare. Dacă este adevărată, returnează valoarea; dacă nu, returnează null. Așa transformi o verificare într-o valoare care poate lipsi, pe care o combini apoi cu ?., ?.let sau ?:.

takeUnless este opusul: returnează valoarea când condiția este falsă. x.takeUnless { it.isBlank() } înseamnă „ia textul, cu excepția cazului în care e gol”.

Parametri

Parametru Descriere
predicate: (T) -> Boolean Condiția; primește valoarea ca it.

Ce returnează

Valoarea (T?) sau null, după rezultatul condiției.

Exemple

Exemplul 1: Validarea unei vârste citite ca text

toIntOrNull dă null pentru text care nu e număr, iar takeIf dă null pentru vârste în afara intervalului. Elvis-ul dă mesajul de eroare.

fun varstaValida(text: String): String {
    val varsta = text.toIntOrNull()?.takeIf { it in 0..120 }
    return varsta?.let { "Vârstă acceptată: $it" } ?: "„$text” nu este o vârstă validă"
}

fun main() {
    println(varstaValida("34"))
    println(varstaValida("150"))
    println(varstaValida("abc"))
}

Rezultat

Vârstă acceptată: 34
„150” nu este o vârstă validă
„abc” nu este o vârstă validă

Exemplul 2: takeUnless pentru a ignora textele goale

fun main() {
    val campuri = listOf("Ana", "   ", "Brașov", "")
    for (camp in campuri) {
        val valoare = camp.takeUnless { it.isBlank() } ?: "(gol)"
        println("[$valoare]")
    }
}

Rezultat

[Ana]
[(gol)]
[Brașov]
[(gol)]

Greșeli frecvente

  • Uiți că rezultatul poate fi null și scrii x.takeIf { ... }.length. Nu compilează; folosește ?. sau ?:.
  • Pui în condiție o acțiune cu efect (afișare, scriere). Condiția se rulează mereu, chiar dacă rezultatul nu e folosit; păstreaz-o simplă.

Comenzi înrudite

  • let: Rulează un bloc de cod cu valoarea ca parametru it și returnează rezultatul blocului; des folosit cu ?. pentru valori null.
  • String.toInt: Transformă un text în număr întreg; toInt aruncă excepție la text invalid, toIntOrNull returnează null.
  • String.ifBlank: ifBlank înlocuiește un text gol sau doar cu spații cu o valoare implicită; orEmpty transformă null în „”.