在Kotlin从lambda隐含回归

Wil*_*ill 23 kotlin

看起来lambda的最后一行总是返回该值,即使你省略了该return语句.它是否正确?是否记录在任何地方?

fun main(args: Array<String>) {
    val nums = arrayOf(1, 2, 3)
    val numsPlusOne = nums.map { it -> 
        val r = it + 1
        r
    }
    // numsPlusOne = [2, 3, 4]
}
Run Code Online (Sandbox Code Playgroud)

hot*_*key 37

是的,这是正确的,如果lambda的最后一个语句是一个表达式,它被认为是它的返回值.

是参考文献所说的内容(感谢@KirillRakhman):

我们可以使用限定的返回语法显式地从lambda返回一个值.否则,将隐式返回最后一个表达式的值.因此,以下两个片段是等效的:

ints.filter {
    val shouldFilter = it > 0 
    shouldFilter
}
Run Code Online (Sandbox Code Playgroud)

ints.filter {
    val shouldFilter = it > 0 
    return@filter shouldFilter
}
Run Code Online (Sandbox Code Playgroud)

最后一条语句语义也是如此if(这就是为什么没有三元运算符),when以及try-catch块,这些语句是表达式本身:

val foo = if (bar) { 
    doSomething()
    baz 
} else { 
    doSomethingElse()
    qux 
}
Run Code Online (Sandbox Code Playgroud)

另见:- 的例子whentrycatch.

因此,lambda与这方面的语言结构是一致的.


如果要return在lambda中创建显式语句,请使用return@label语法(另外,使用示例的另一个答案).return相反,未标记的是与最近的fun(忽略的lambdas)一起工作,因此只能出现在内联的 lambda中.

有一种语言提议要添加用于从代码块中发出值的特殊语法,但它被拒绝了.