为什么Kotlin有lambdas /匿名函数的两种语法?

时间:2018-01-05 10:52:46

标签: lambda kotlin anonymous-function

Kotlin有两种声明匿名函数的方法(也就是lambda)。两种不同的语法是:

val lambda =  { input : String -> 
  "received ${string}"
}

val anonymousFunction =  fun (input : String): String {
  return "received ${string}"
}

我理解两者之间的区别(如this answer中所述),但我不明白的是为什么语言有两种不同的方式来声明同一事物。

对于另一个经验,是否有优化工作?匿名函数版本是否过于冗长? lambda版本的语法不支持返回类型吗?

1 个答案:

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