Kotlin 可暂停和不可暂停函数中的重用逻辑

Kotlin 可暂停和不可暂停函数中的重用逻辑,kotlin,Kotlin,以下两个方法包含相同的功能,唯一的区别是一个是可挂起的,另一个不是(参数相同) 如何提取实现并将其用于这两个功能 fun validationWrapper(supplier: () -> Unit) = try { supplier.invoke() } catch (ex: Exception) { when (ex) { is IllegalArgumentException, is IllegalStateException -> throw

以下两个方法包含相同的功能,唯一的区别是一个是可挂起的,另一个不是(参数相同)

如何提取实现并将其用于这两个功能

fun validationWrapper(supplier: () -> Unit) = try {
    supplier.invoke()
} catch (ex: Exception) {
    when (ex) {
        is IllegalArgumentException, is IllegalStateException -> throw ValidationException(ex.message!!)
        else -> throw ex
    }
}

suspend fun validationWrapper(supplier: suspend () -> Unit) = try {
    supplier.invoke()
} catch (ex: Exception) {
    when (ex) {
        is IllegalArgumentException, is IllegalStateException -> throw ValidationException(ex.message!!)
        else -> throw ex
    }
}

我只能保留suspendable函数,但这意味着每次使用它时都应该使用
运行阻塞

保留非挂起版本,并使其
内联
。这就解决了问题,因为内联lambda可以包含挂起调用,而无需声明
suspend
本身。这就是大多数Kotlin stdlib的工作方式(
forEach
map
,等等):

inline fun validationWrapper(供应商:()->单位)=尝试{
supplier.invoke()
}捕获(例如:异常){
何时(前){
是IllegalArgumentException,是IllegalStateException->throw ValidationException(例如message!!)
else->掷骰子
}
}
此外,它通常对于将lambda声明为
内联的高阶函数非常有用,因为它避免了lambda实例的额外开销