Result.map în Kotlin

map transformă valoarea unui Result reușit și lasă eroarea neschimbată; fold dă o valoare finală din ambele cazuri.

Sintaxă
inline fun <R, T> Result<T>.map(transform: (value: T) -> R): Result<R>
inline fun <R, T> Result<T>.fold(onSuccess: (value: T) -> R, onFailure: (exception: Throwable) -> R): R

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.