public value class Result<out T> internal constructor( internal val value: Any? ) : Serializable |
- 对于一些需要关心结果的操作,成功时需要得到数据,失败时需要得到信息。返回的 Result 只能是 success 或 failure 中的一种,success持有一个泛型数据T,failure持有一个异常Throwable。
- 是一个 value class 意味着是为了安全用来对数据进行包装(装箱)的强类型,返回值是 Serializable 意味着被包装的数据类型需要实现序列化否则抛异常 NotSerializableException。泛型是 <out T> 上限定意味着只能作为生产者,即结果只能被读取。形参类型是 Any? 因为成功传入的是值T失败传入的是异常Throwable。
success( ) failure( ) | public inline fun <T> success(value: T): Result<T> = Result(value) //成功时调用,来包装返回的值。 public inline fun <T> failure(exception: Throwable): Result<T> = Result(createFailure(exception)) //失败时调用,来包装返回的异常。 |
.isSuccess .isFailure | public val isSuccess: Boolean get() = value !is Failure 返回的结果是成功吗 public val isFailure: Boolean get() = value is Failure 返回的结果是失败吗 |
onSuccess( ) onFailure( ) | public inline fun <T> Result<T>.onSuccess(action: (value: T) -> Unit): Result<T> public inline fun <T> Result<T>.onFailure(action: (exception: Throwable) -> Unit): Result<T> 返回的结果是成功或失败时的回调,做一些操作。 |
getOrNull( ) Result.getOrThrow( ) Result.getOrElse( ) Result.getOrDefault( ) | public inline fun getOrNull(): T? 返回的结果是成功就得到值,失败就得到null,不关心异常。 public inline fun <T> Result<T>.getOrThrow(): T 返回的结果是成功就得到值,失败就抛异常,不处理异常。 public inline fun <R, T : R> Result<T>.getOrElse(onFailure: (exception: Throwable) -> R): R 返回的结果是成功就得到值,失败就执行传入的onFailure来处理异常并返回一个值。 public inline fun <R, T : R> Result<T>.getOrDefault(defaultValue: R): R 返回的结果是成功就得到值,失败就得到默认值。 |
exceptionOrNull( ) | public fun exceptionOrNull(): Throwable? 返回的结果是失败就得到异常,成功就得到null,不关心值。 |
runCatching( ) | public inline fun <R> runCatching(block: () -> R): Result<R> public inline fun <T, R> T.runCatching(block: T.() -> R): Result<R> 执行block,成功就返回值,发生异常就返回失败。 |
Result.fold( ) | public inline fun <R, T> Result<T>.fold( 返回的结果是成功就执行传入的onSuccess将T值转换成R值返回, 返回的结果是失败就执行传入的onFailure来处理异常并返回一个值。 |
Result.map( ) Result.mapCatching( ) | public inline fun <R, T> Result<T>.map(transform: (value: T) -> R): Result<R> 返回的结果是成功就执行传入的transform将T值转换成R值返回, 返回的结果是失败或者执行传入的transform发生异常都返回异常。 public inline fun <R, T> Result<T>.mapCatching(transform: (value: T) -> R): Result<R> 返回的结果是成功就组合执行runCatching(transform),transform将T值转换成R值,执行成功就返回R值,执行异常就返回异常。 返回的结果是失败或者执行传入的transform发生异常都返回异常。 |
Result.recover( ) Result.recoverCatching( ) | public inline fun <R, T : R> Result<T>.recover(transform: (exception: Throwable) -> R): Result<R> 返回的结果是成功就返回值, 返回的结果是失败就执行传入的transform处理异常并返回一个值。 public inline fun <R, T : R> Result<T>.recoverCatching(transform: (exception: Throwable) -> R): Result<R> 返回的结果是成功就返回值, 返回的结果是失败就执行传入的transform处理异常并返回一个值,执行成功就返回值,执行失败就返回异常。 |
val boolean = true
fun demo() = if (boolean) Result.success(123) else Result.failure(Exception())
val result = demo()
println(result.isFailure) //打印:false
result.onSuccess { println(it) } //打印:123
val recover = result.recover { 5 }
println(recover) //打印:Success(123)