Kotlin:何时以及如何使用 Lambda 表达式

Nov*_*cas 1 lambda android kotlin

我最近一直在为我的 Android 项目转向 Kotlin,但在理解 Lambda 时遇到了问题。当我们将 Java 文件转换为 Kotlin 文件时,我们会看到许多 lambda 表达式。

何时以及如何准确使用 lambda 函数?另外,高阶函数和 lambda 函数/表达式之间有什么区别?

专门针对 Android 的答案会有所帮助。

Win*_*ini 6

对于拉姆达

\n
    \n
  • Lambda 是一个文字函数,这意味着它不被声明,而是作为表达式传递。
  • \n
  • Lambda 表达式始终由\n大括号 {...} 包围
  • \n
  • 如果参数类型可以被推断,则它们是可选的。
  • \n
  • Lambda\xe2\x80\x99s 主体位于箭头 -> 之后。
  • \n
  • 与常规函数类似,lambda 具有函数类型。
  • \n
\n
{a:Int, b:Int -> a + b} // lambda of function type: (Int, Int) -> Int\n\n// Equivalent function \nfun sum(a:Int , b:Int) = a + b \n
Run Code Online (Sandbox Code Playgroud)\n

--)我们可以将 lambda 赋给类似函数类型的变量:

\n
var sum: (Int, Int) -> Int = {a:Int, b:Int -> a + b} \n
Run Code Online (Sandbox Code Playgroud)\n

--)可以写成没有参数类型。

\n
val sum: (Int, Int) -> Int = {a , b -> a + b} \n\n println(sum(2,3)) // call sum\n
Run Code Online (Sandbox Code Playgroud)\n

特殊情况:具有单参数的 Lambda

\n

单参数 Lambda 是一种特殊情况。

\n

单个参数可以与箭头一起省略->,并将其用作对单个参数的引用。

\n

常规方式:\nvar increment: (Int) -> Int = { a -> a + 1 }

\n

特殊情况,单个参数按原样引用\nvar increment: (Int) -> Int = { it + 1 }

\n

以 lambda 形式返回?

\n
 val sum: (Int, Int) -> Int = {a , b -> \n    println("a = $a")\n    println("b = $b")\n    a + b // last expression is returned\n}\n
Run Code Online (Sandbox Code Playgroud)\n

从示例来看,默认情况下,隐式返回 lambda 的最后一个表达式。

\n

匿名函数

\n

匿名函数也是一个字面函数,这意味着它不被声明,而是作为表达式传递。\n匿名函数是没有名称的常规函数​​。\n与常规函数类似,匿名函数也具有函数类型。

\n
var sum: (Int, Int) -> Int = fun(x: Int, y: Int): Int = x + y\n\n println(sum(2,3)) // call sum\n
Run Code Online (Sandbox Code Playgroud)\n

高阶函数

\n

--)高阶函数可以将函数作为参数或者返回一个函数。

\n

--)接受函数的参数类型或返回类型使用函数类型声明。

\n
//  Higher-Order Function\n fun higherOrderSum(a:Int, b:Int, f: (Int, Int) -> Int): Int{\nreturn f(a,b)\n  }\n  typealias someType = (Int, Int) -> Int\n\n  fun main() {  \n  val lambdaSum: someType = {a , b -> a + b}     \n  println(higherOrderSum(2, 3, lambdaSum)) // 5\n   }\n
Run Code Online (Sandbox Code Playgroud)\n

Android 中的 Lambda

\n
val view = findViewById(R.id.welcomeMessage)\nview.setOnClickListener { v -> navigateWithView(v) }\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,左侧定义了函数的输入值(在本例中是视图),右侧声明了函数将执行的操作。

\n

如何定义接受 lambda 的函数

\n
fun setOnClickListener(listener: (view: View) -> Unit){}\n
Run Code Online (Sandbox Code Playgroud)\n

这称为高阶函数,因为它是通过参数接收函数或返回函数的函数。

\n


s1m*_*nw1 5

何时以及如何准确使用 lambda 函数?另外,高阶函数和 lambda 函数/表达式之间有什么区别?

一个拉姆达是一个匿名函数。它允许您在不命名函数的情况下编写函数。

高阶函数是一个函数,它的另一函数作为参数(通常为通过拉姆达返回一个结果。

很难告诉您何时真正应该使用lambda 。正如已经看到的,高阶函数可能是主要用例。这是将“应该做什么”传递给另一个函数的好方法。许多标准函数确实使用它。一个简单的例子是forEach一个集合:

listOf(1,2,3).forEach{
   //tell what to do with each element in this lambda
}
Run Code Online (Sandbox Code Playgroud)

找到 lambdas 的另一个好地方是DSL,例如Anko库中包含的DSL。这些构造也大量使用了 lambda。