Замена неудачи в Kotlin
Функция recover срабатывает только при неудаче. Лямбда
получает исключение и возвращает новое значение, из
которого собирается успешный Result. Успех
до вызова не меняется:
fun main() {
val ok = Result.success("live")
val kept = ok.recover { "backup" }
println(kept)
val bad = Result.failure<String>(IllegalStateException("down"))
val fixed = bad.recover { "backup" }
println(fixed)
}
Так задают значение по умолчанию после сбойного шага,
не разворачивая вложенные if:
fun readTag(raw: String): Result<String> {
return runCatching {
require(raw.isNotBlank())
raw.trim()
}.recover { "unknown" }
}
fun main() {
println(readTag(" api "))
println(readTag(" "))
}
Функция recoverCatching, как и recover, работает
только на неудаче, но ловит исключение внутри лямбды
замены. Если подстановка сама падает, наружу снова
уходит Result с ошибкой:
fun main() {
val empty = Result.failure<Int>(IllegalArgumentException("no data"))
val safe = empty.recoverCatching { error ->
error.message!!.length
}
println(safe)
val noMessage = Result.failure<Int>(RuntimeException())
val risky = noMessage.recoverCatching { error ->
error.message!!.length
}
println(risky)
}
Неудачный Result с Int замените на
число 0. Успешный Result с 5
пропустите через тот же прием и выведите оба
значения через getOrNull на отдельных строках.
После сбойного разбора строки ".." в число
подставьте длину исходной строки в цепочке с
безопасной лямбдой замены. Выведите итоговый
Result.