为什么 Kotlin 对于 lambdas / 匿名函数有两种语法?
Why does Kotlin have two syntaxes for lambdas / anonymous functions?
Kotlin 有两种声明匿名函数(又名 lambda)的方法。两种不同的语法是:
val lambda = { input : String ->
"received ${input}"
}
和
val anonymousFunction = fun (input : String): String {
return "received ${input}"
}
我理解两者之间的区别(如 中所述),但我不明白的是为什么该语言有两种不同的方式来声明同一事物。
是否有针对其中一节和另一节的优化在起作用?匿名函数版本是否被认为过于冗长?语法的 lambda 版本是否不支持 return 类型?
关键原因是 lambda 对 returns 的支持。 returns 的规则是 return
关键字 returns 来自最近的用 fun
关键字声明的函数。在某些情况下,您希望代码块中的 return
到封闭函数中的 return,因此您使用 lambda:
fun processElements(list: List<Element>): Boolean {
list.forEach { element ->
if (!element.process()) return false // returns from processElements()
}
return true
}
在其他情况下,您希望 return 来自块而不是来自封闭函数。使用 lambda 时,从块中 returning 需要 return@label
语法,这有点笨拙:
fun processElements(list: List<Element>) {
list.forEach { element ->
if (!needToProcessElement(element)) return@forEach // returns from block
element.process()
}
}
为了避免笨拙,我们提供了另一种语法 - 匿名函数 - 它允许您直接使用 return
到 return 从块:
fun processElements(list: List<Element>) {
list.forEach(fun(element) {
if (!needToProcessElement(element)) return // returns from block
element.process()
})
}
第二个原因是 return 类型声明确实不可能适合 lambda 的语法,但这在实践中很少需要,所以它不是特别重要。
Kotlin 有两种声明匿名函数(又名 lambda)的方法。两种不同的语法是:
val lambda = { input : String ->
"received ${input}"
}
和
val anonymousFunction = fun (input : String): String {
return "received ${input}"
}
我理解两者之间的区别(如
是否有针对其中一节和另一节的优化在起作用?匿名函数版本是否被认为过于冗长?语法的 lambda 版本是否不支持 return 类型?
关键原因是 lambda 对 returns 的支持。 returns 的规则是 return
关键字 returns 来自最近的用 fun
关键字声明的函数。在某些情况下,您希望代码块中的 return
到封闭函数中的 return,因此您使用 lambda:
fun processElements(list: List<Element>): Boolean {
list.forEach { element ->
if (!element.process()) return false // returns from processElements()
}
return true
}
在其他情况下,您希望 return 来自块而不是来自封闭函数。使用 lambda 时,从块中 returning 需要 return@label
语法,这有点笨拙:
fun processElements(list: List<Element>) {
list.forEach { element ->
if (!needToProcessElement(element)) return@forEach // returns from block
element.process()
}
}
为了避免笨拙,我们提供了另一种语法 - 匿名函数 - 它允许您直接使用 return
到 return 从块:
fun processElements(list: List<Element>) {
list.forEach(fun(element) {
if (!needToProcessElement(element)) return // returns from block
element.process()
})
}
第二个原因是 return 类型声明确实不可能适合 lambda 的语法,但这在实践中很少需要,所以它不是特别重要。