从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
(这就是为什么没有三元运算符) , when
和try
– catch
块也是如此,这些语句本身是表达式:
val foo = if (bar) { doSomething() baz } else { doSomethingElse() qux }
另请参阅: when
和try
– catch
示例 。
所以,lambda与这方面的语言结构是一致的。
如果你想在lambda中做一个显式的return
语句,可以使用return@label
语法 (另外还有一个例子 )。 相反,无标签的return
与最近的fun
(忽略lambda表达式)一起工作,因此只能出现在内联的 lambda表达式中。
有一个语言的提议 ,增加了一个特殊的语法来从代码块发出一个值,但它被拒绝了。