Kotlin:Lambda内部有多个收益

时间:2019-11-29 08:55:48

标签: kotlin lambda

我有一个捕获可恢复异常并返回回退的功能

private fun <T> safely(block: () -> T, fallback: T): T {
    return try {
        block()
    } catch(exc: SomeException) {
        // Log the exception/do some logic
        fallback
    }
}

我希望能够将此添加到类的公共方法中,例如

fun doSomething(): List<String> = safely({
    val list = mutableListOf<String>("Hello")
    fun someCheck1() = false // Some boolean value
    fun someCheck2() = true // Some boolean value
    do {
        if(someCheck2()) {
            return arrayListOf<String>("Hello", "World")
        }
    } while (someCheck1())
    return list
}, arrayListOf<String>())

但是我遇到编译器错误'return' is not allowed here

但是,如果我删除了return,那么循环中的返回值将不再起作用,并且它会在IDE中突出显示,并显示警告the expression is never used

如何在Lambda中维护这种类型的返回逻辑?

Playground Example

2 个答案:

答案 0 :(得分:2)

尝试

fun doSomething(): List<String> = safely(
    {
        val list = mutableListOf<String>("Hello")
        fun someCheck1() = false // Some boolean value
        fun someCheck2() = true // Some boolean value
        do {
            if (someCheck2()) {
                return@safely arrayListOf<String>("Hello", "World")
            }
        } while (someCheck1())
        list
    }
, arrayListOf<String>())

有关更多参考,请选中Using return inside a lambda?

或者您也可以将代码块提取到一个单独的函数(即someCheckFunction(): List<String>)中,并拥有fun doSomething() = safely({ someCheckFunction() }, arrayListOf()),但是我想您想像上面那样维护lambda代码。

答案 1 :(得分:1)

return arrayListOf<String>("Hello", "World")在这里尝试从doSomething函数而不是从传递给safely的lambda返回值。但是,这种返回是非本地的,因为它试图从不在堆栈顶部的函数退出,因此被禁止。

这里的另一种选择是使safely函数内联

inline fun <T> safely(block: () -> T, fallback: T): T { ... }

然后您就可以通过传递给它的block lambda函数进行非本地返回。