为什么 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 的语法,但这在实践中很少需要,所以它不是特别重要。