从Kotlin的lambda隐含的回报

看起来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] } 

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

以下是参考文献 (谢谢@KirillRakhman ):

我们可以使用合格的返回语法显式地从lambda返回一个值。 否则,最后一个表达式的值被隐式地返回。 因此,以下两个片段是等价的:

 ints.filter { val shouldFilter = it > 0 shouldFilter } 

 ints.filter { val shouldFilter = it > 0 return@filter shouldFilter } 

最后一个语句的语义对于if (这就是为什么没有三元运算符) , whentrycatch块也是如此,这些语句本身是表达式:

 val foo = if (bar) { doSomething() baz } else { doSomethingElse() qux } 

另请参阅: whentrycatch示例 。

所以,lambda与这方面的语言结构是一致的。


如果你想在lambda中做一个显式的return语句,可以使用return@label语法 (另外还有一个例子 )。 相反,无标签的return与最近的fun (忽略lambda表达式)一起工作,因此只能出现在内联的 lambda表达式中。

有一个语言的提议 ,增加了一个特殊的语法来从代码块发出一个值,但它被拒绝了。