对于 Lambda
- Lambda 是一个文字函数,这意味着它没有被声明,但是
作为表达式传递。
- Lambda 表达式总是被包围
花括号 {...}
- 如果可以,参数类型是可选的
推断。
- Lambda 的身体跟随箭头 ->。
- 类似于常规
函数,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
单参数 Lambda 是一种特殊情况。
单个参数可以和箭头->一起省略,作为对单个参数的引用。
常规方式:
var increment: (Int) -> Int = { a -> a + 1 }
特殊情况,单个参数被引用为它
var increment: (Int) -> Int = { it + 1 }
在 lambda 中返回?
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
}
Android 中的 Lambda
val view = findViewById(R.id.welcomeMessage)
view.setOnClickListener { v -> navigateWithView(v) }
如您所见,左侧定义了函数的输入值(在本例中为视图),右侧声明了该函数将执行的操作。
如何定义一个接受 lambdas 的函数
fun setOnClickListener(listener: (view: View) -> Unit){}
这被称为高阶函数,因为它是一个通过参数接收函数或返回函数的函数。