Nov*_*cas 1 lambda android kotlin
我最近一直在为我的 Android 项目转向 Kotlin,但在理解 Lambda 时遇到了问题。当我们将 Java 文件转换为 Kotlin 文件时,我们会看到许多 lambda 表达式。
何时以及如何准确使用 lambda 函数?另外,高阶函数和 lambda 函数/表达式之间有什么区别?
专门针对 Android 的答案会有所帮助。
对于拉姆达
\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 \nRun Code Online (Sandbox Code Playgroud)\n--)我们可以将 lambda 赋给类似函数类型的变量:
\nvar sum: (Int, Int) -> Int = {a:Int, b:Int -> a + b} \nRun Code Online (Sandbox Code Playgroud)\n--)可以写成没有参数类型。
\nval sum: (Int, Int) -> Int = {a , b -> a + b} \n\n println(sum(2,3)) // call sum\nRun Code Online (Sandbox Code Playgroud)\n单参数 Lambda 是一种特殊情况。
\n单个参数可以与箭头一起省略->,并将其用作对单个参数的引用。
常规方式:\nvar increment: (Int) -> Int = { a -> a + 1 }
特殊情况,单个参数按原样引用\nvar increment: (Int) -> Int = { it + 1 }
val sum: (Int, Int) -> Int = {a , b -> \n println("a = $a")\n println("b = $b")\n a + b // last expression is returned\n}\nRun Code Online (Sandbox Code Playgroud)\n从示例来看,默认情况下,隐式返回 lambda 的最后一个表达式。
\n匿名函数也是一个字面函数,这意味着它不被声明,而是作为表达式传递。\n匿名函数是没有名称的常规函数。\n与常规函数类似,匿名函数也具有函数类型。
\nvar sum: (Int, Int) -> Int = fun(x: Int, y: Int): Int = x + y\n\n println(sum(2,3)) // call sum\nRun Code Online (Sandbox Code Playgroud)\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 }\nRun Code Online (Sandbox Code Playgroud)\nval view = findViewById(R.id.welcomeMessage)\nview.setOnClickListener { v -> navigateWithView(v) }\nRun Code Online (Sandbox Code Playgroud)\n正如您所看到的,左侧定义了函数的输入值(在本例中是视图),右侧声明了函数将执行的操作。
\nfun setOnClickListener(listener: (view: View) -> Unit){}\nRun Code Online (Sandbox Code Playgroud)\n这称为高阶函数,因为它是通过参数接收函数或返回函数的函数。
\n何时以及如何准确使用 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。
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |