我最近一直在为我的Android项目转移到Kotlin,并且在理解Lambdas时遇到了问题。当我们将Java文件转换为Kotlin文件时,我们会看到许多lambda表达式。
何时以及如何使用lambda函数?另外,高阶函数和lambda函数/表达式之间有什么区别?
特别针对Android的上下文中的答案会有所帮助。
答案 0 :(得分:4)
何时以及如何使用lambda函数?什么是 高阶函数和lambda之间的区别 功能/表达
lambda 是一个匿名函数。它允许您在不命名的情况下编写函数。
高阶函数是一个函数,它将另一个函数作为参数(通常作为 lambda 传递)或返回一个函数结果。
很难告诉你什么时候应该使用lambda。如前所述,高阶函数可能是主要的用例。这是将“应该做什么”传递给另一个函数的好方法。许多标准函数都使用它。一个简单的例子是集合上的forEach
:
listOf(1,2,3).forEach{
//tell what to do with each element in this lambda
}
答案 1 :(得分:1)
对于 Lambda
{a:Int, b:Int -> a + b} // lambda of function type: (Int, Int) -> Int
// Equivalent function
fun sum(a:Int , b:Int) = a + b
-)我们可以将lambda分配给类似函数类型的变量:
var sum: (Int, Int) -> Int = {a:Int, b:Int -> a + b}
-)可以编写不带参数类型的
val sum: (Int, Int) -> Int = {a , b -> a + b}
println(sum(2,3)) // call sum
具有单个参数的Lambda是一种特殊情况。
可以省略单个参数以及箭头->
,并将其用作对单个参数的引用。
常规方式:
var increment: (Int) -> Int = { a -> a + 1 }
特殊情况,引用单个参数
var increment: (Int) -> Int = { it + 1 }
val sum: (Int, Int) -> Int = {a , b ->
println("a = $a")
println("b = $b")
a + b // last expression is returned
}
例如,默认情况下,隐式返回lambda的最后一个表达式。
匿名函数也是文字函数,这意味着它没有声明而是作为表达式传递。 匿名函数是没有名称的常规函数。 与常规函数类似,匿名函数具有函数类型。
var sum: (Int, Int) -> Int = fun(x: Int, y: Int): Int = x + y
println(sum(2,3)) // call sum
-)高阶函数可以将函数作为参数或返回函数。
-)使用函数类型声明接受函数的参数类型或返回类型。
// Higher-Order Function
fun higherOrderSum(a:Int, b:Int, f: (Int, Int) -> Int): Int{
return f(a,b)
}
typealias someType = (Int, Int) -> Int
fun main() {
val lambdaSum: someType = {a , b -> a + b}
println(higherOrderSum(2, 3, lambdaSum)) // 5
}
val view = findViewById(R.id.welcomeMessage)
view.setOnClickListener { v -> navigateWithView(v) }
如您所见,左侧定义了函数的输入值(在本例中为视图),右侧定义了函数将执行的操作。
fun setOnClickListener(listener: (view: View) -> Unit){}
这被称为高阶函数,因为它是通过参数接收函数或返回函数的函数。