一、函数类型
在 Kotlin 里,有一类 Java 中不存在的类型,叫做「函数类型」,这一类类型的对象在可以当函数来用的同时,还能作为函数的参数、函数的返回值以及赋值给变量
所有函数类型都有一个圆括号括起来的参数类型列表以及一个返回类型:
(A, B) -> C
表示接受类型分别为A
与B
两个参数并返回一个C
类型值的函数类型。 参数类型列表可以为空,如() -> A
。返回类型为空 Unit 不能省略。
//样式
(参数列表类型) -> 返回值类型
//比如,定义一个函数类型的变量
val sum: (Int) -> Int
//方法中定义 函数类型参数
fun test(age: Int, action: (Int) -> String) {}
如需将函数类型指定为可空,使用圆括号:((Int, Int) -> Int)?
。
函数类型可以使用圆括号进行接合:(Int) -> ((Int) -> Unit)
箭头表示法是右结合的,(Int) -> (Int) -> Unit
与前述示例等价,但不等于 ((Int) -> (Int)) -> Unit
。
二、函数类型实例化
//1.lambda表达式
val sum = { a: Int, b: Int -> a + b }
//2.匿名函数
val sum1 = fun(a: Int, b: Int) { a + b }
//3.双冒号,函数引用
fun sumab(a: Int, b: Int): Int {
return a + b
}
val sum2 = ::sumab
三、lambda表达式
1.基本形式
//例如调用上面方法,传入lambda表达式,内部会 自动创建对应的对象
test(12, { it -> "aa" })
2.基本使用
//方法中定义,需要传入 函数类型 的参数
fun test(age: Int, action: (Int) -> String) {
val result = action(age)
println(result)
}
//使用此方法
test(12, { it -> "aa" })
3.语法简化
login.setOnClickListener({ v: View ->
//doSomething
})
//如果Lambda为最后一个参数,可以放到括号外面
login.setOnClickListener() { v: View ->
//doSomething
}
//lambda是setOnClickListener 单参数,括号省略
login.setOnClickListener { v: View ->
//doSomething
}
//lambda表达式中参数只有一个,参数省略,如果需要使用,it代替
login.setOnClickListener {
//doSomething
}
四、匿名函数
//赋值给变量
val add = fun(a: Int, b: Int): Int { return a + b }
val multiply = fun(a: Int, b: Int): Int { return a * b }
fun calculate(action: (Int, Int) -> Int): Int {
val a = 1
val b = 2
return action(a, b)
}
fun main() {
println(calculate(add))
println(calculate(multiply))
}
或者直接在参数里创建一个 匿名函数
calculate(fun(a: Int, b: Int): Int { return a + b })
1
五、函数引用
//定义一个普通函数/方法
fun cc(a: Int, b: Int): Int {
return a + b
}
fun main() {
//用双冒号创建一个函数类型的对象
val ccInstance = ::cc
cc(1, 2) //直接调用函数
ccInstance(1,2) //用赋值的变量调用
(::cc)(1, 2) //对象 ::cc 调用,和上面等价
}
对于有相同变量名的重载方法,需要显示指明变量的函数类型才行
fun cc(a: Int, b: Int): Int {
return a + b
}
fun cc(a: Int, b: Int, c:Int): Int {
return a + b + c
}
fun main() {
//显示指明变量具体的函数类型
val ccInstance1 : (Int, Int) -> Int = ::cc
val ccInstance2 : (Int, Int, Int) -> Int = ::cc
}