Kotlin有两种声明匿名函数的方法(也就是lambda)。两种不同的语法是:
val lambda = { input : String ->
"received ${string}"
}
和
val anonymousFunction = fun (input : String): String {
return "received ${string}"
}
我理解两者之间的区别(如this answer中所述),但我不明白的是为什么语言有两种不同的方式来声明同一事物。
对于另一个经验,是否有优化工作?匿名函数版本是否过于冗长? lambda版本的语法不支持返回类型吗?
答案 0 :(得分:15)
关键原因是支持lambdas的回报。返回规则是return
关键字从使用fun
关键字声明的最近函数返回。在某些情况下,您希望代码块中的return
从封闭函数返回,因此您使用lambda:
fun processElements(list: List<Element>): Boolean {
list.forEach { element ->
if (!element.process()) return false // returns from processElements()
}
return true
}
在其他情况下,您希望从块中返回,而不是从封闭函数返回。使用lambda时,从块返回需要return@label
语法,这有点笨拙:
fun processElements(list: List<Element>) {
list.forEach { element ->
if (!needToProcessElement(element)) return@forEach // returns from block
element.process()
}
}
为避免笨拙,我们提供了另一种语法 - 匿名函数 - 允许您直接使用return
从块中返回:
fun processElements(list: List<Element>) {
list.forEach(fun(element) {
if (!needToProcessElement(element)) return // returns from block
element.process()
})
}
第二个原因是,确实不可能将返回类型声明放入lambda的语法中,但这在实践中很少需要,所以它并不是特别重要。