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 „”.