runCatching
runCatching 使用来替换java 的try catch的
val result = runCatching<String> {
"大学"
throw Exception("dff")
}.onSuccess {
println("onSuccess=${it}")
}.onFailure {
println("onFailure=${it}")
}
//里面用的也是try, catch
public inline fun <R> runCatching(block: () -> R): Result<R> {
return try {
Result.success(block())
} catch (e: Throwable) {
Result.failure(e)
}
}
//success方法是将block函数返回的 R值转成Result对象,如果执行有异常则执行catch中的 Result.failure(e)
public inline fun <T> success(value: T): Result<T> =
Result(value)
返回result
public value class Result<out T> @PublishedApi internal constructor(
@PublishedApi
internal val value: Any?
)
Result对象中有一些扩展函数可以拿到当前的value
比如:
.getOrNull()
public inline fun getOrNull(): T? =
when {
isFailure -> null
else -> value as T
}
如果是失败返回null,成功就将value 强转成自己传入的类型
also {}
运算block函数,返回当前的对象,适用于日志记录或调试:
public inline fun <T> T.also(block: (T) -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block(this)
return this
}
和apply特别像 ,
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
1. also
适用场景:
用于副作用(比如日志、调试、检查等),但不改变原对象。
返回原对象,因此适用于链式调用
2. apply
适用场景:
主要用于配置对象,通常用于初始化对象的属性。
返回调用者自身,因此适用于初始化模式。