Ce face Result.map
rezultat.map { it * 2 } aplică transformarea doar dacă rezultatul este Success și returnează un nou Result. Dacă era Failure, eroarea trece mai departe neschimbată, iar blocul nu rulează. Așa înlănțuiești pași fără să verifici erorile după fiecare.
fold(onSuccess = { ... }, onFailure = { ... }) „închide” un Result: rulează unul dintre cele două blocuri și returnează direct valoarea lui (nu un Result). Ambele blocuri trebuie să returneze același tip.
Dacă transformarea din map poate și ea arunca o excepție, folosește mapCatching: map lasă excepția să iasă din Result.
Parametri
| Parametru | Descriere |
|---|---|
transform: (value: T) -> R |
La map: transformarea valorii. |
onSuccess, onFailure |
La fold: ce valoare se produce în fiecare caz. |
Ce returnează
map: un nou Result<R>. fold: valoarea de tip R dată de unul dintre blocuri.
Exemple
Exemplul 1: map pe Success și pe Failure
Prețul valid este transformat în preț cu TVA. Pentru textul greșit, map nu rulează și rămâne Failure.
fun main() {
for (text in listOf("100", "o sută")) {
val cuTva = runCatching { text.toDouble() }
.map { it * 1.19 }
.map { "%.2f lei".format(it) }
println(cuTva)
}
}
Rezultat
Success(119.00 lei)
Failure(java.lang.NumberFormatException: For input string: "o sută")
Exemplul 2: fold pentru un mesaj final
fun mesajVarsta(text: String): String =
runCatching { text.trim().toInt() }.fold(
onSuccess = { if (it >= 18) "Major ($it ani)" else "Minor ($it ani)" },
onFailure = { "Vârstă invalidă: „$text”" },
)
fun main() {
println(mesajVarsta(" 25 "))
println(mesajVarsta("16"))
println(mesajVarsta("douăzeci"))
}
Rezultat
Major (25 ani)
Minor (16 ani)
Vârstă invalidă: „douăzeci”
Greșeli frecvente
- Aruncă excepție în blocul lui map și te aștepți să ajungă în Result. Nu ajunge; folosește
mapCatching. - La fold, cele două blocuri returnează tipuri diferite (un număr și un text). Rezultatul devine
Any; dă-le același tip.
Comenzi înrudite
runCatching: Rulează un bloc și prinde orice excepție într-un Result; valoarea se scoate cu getOrNull, getOrElse sau getOrThrow.Result.onSuccess: Rulează o acțiune doar dacă Result a reușit (onSuccess) sau doar dacă a eșuat (onFailure); ambele returnează același Result.