[英]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 版本是否不支持返回類型?
關鍵原因是對 lambda 返回的支持。 返回的規則是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
需要return@label
語法,這有點笨拙:
fun processElements(list: List<Element>) {
list.forEach { element ->
if (!needToProcessElement(element)) return@forEach // returns from block
element.process()
}
}
為了避免clunkiness,我們提供了一個替代語法-匿名功能-它允許你使用return
直接從座返回:
fun processElements(list: List<Element>) {
list.forEach(fun(element) {
if (!needToProcessElement(element)) return // returns from block
element.process()
})
}
第二個原因是,確實不可能將返回類型聲明放入 lambda 的語法中,但這在實踐中很少需要,因此並不是特別重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.