注:编码工具为IntelliJ
目录
笔记二里面记录过匿名函数和lambda表达式,这节稍微展开记录一些相关的定义和使用。
函数类型变量
Kotlin中函数可以作为一种类型,可以定义变量,可以将匿名函数,也即lambda表达式赋值给函数类型变量。
函数类型变量声明
package step_seven
fun main() {
var method: () -> Unit
var method2: (Int) -> String
var method3: (Int, Int) -> Int
}
函数变量自动类型推断
可以不显式声明变量的函数类型,直接赋值,编译器会自动推断变量的函数类型。
package step_seven
fun main() {
var method = { println("匿名函数")}
var method2 = {num: Int -> println("num = $num")}
var method3 = {msg: String -> println(msg)}
var method4 = {n1: Int, n2: Int -> n1 + n2}
var method5 = {nStr: String -> nStr.toInt()}
}
函数类型变量声明结合实现
fun main() {
var method : (Int) -> String
method = fun(i: Int): String = i.toString()// 实现方式一
method = fun(i) = i.toString()// 实现方式二
method = {it.toString()}// 实现方式三
method = fun(i): String { return i.toString() }// 实现方式四
var method2:(Int, Int) -> String = {_, n ->
println("_表示函数拒收了参数一")
println("参数二 = $n")
"拒收参数"
}
}
函数类型变量的两种调用方式
方式一:普通函数调用方式
方式二:invoke方法
两种方式本质一样,invoke运算符重载后就是第一种方式。
package step_seven
fun main() {
var method: (Int, Int) -> Int = {a, b -> a + b}
println(method(33, 99))
println(method.invoke(234, 342))
}
输出:
132
576
某种数据类型的扩展函数类型变量
package step_seven
fun main() {
var method: String.() -> Unit = {
println(this)
}
method("调用方式一")
method.invoke("调用方式二")
"调用方式三".method()
var method2: Int.(Int) -> Int = {
this + it
}
println(1.method2(11))
println(method2(23, 99))
println(method2.invoke(324, 999))
}
输出:
调用方式一
调用方式二
调用方式三
12
122
1323
正常定义的函数返回值
正常定义的函数,如果函数声明后面没显示声明返回类型,则默认为Unit。以下示例中几个函数的返回类型都是Unit,而不是最后一行语句执行结果的类型,不要跟lambda表达式混淆,lambda表达式最后一行语句执行结果为返回值。
package step_seven
// 返回类型为Unit
fun method() {
println("method")
}
// 返回类型为Unit
fun method2(){
329847.324
}
// 返回类型为Unit
fun method3(){
true
}
将普通函数用函数引用赋值给变量
fun a(){}
var b = ::a
嵌套
package step_seven
fun main() {
fun method(){
fun nested(){
println("多层嵌套")
}
nested()
}
method()
}
输出:
多层嵌套
高阶函数初探
参数或者返回值类型是函数类型的函数即为高阶函数。
返回值为函数类型的函数:
package step_seven
fun function() = {}
fun function2() = {i: Int -> i.toString()}
fun function3() = {msg: String -> print(msg)}
fun main() {
println(function())
println(function2().invoke(999))
function3().invoke("高阶函数interesting")
}
输出:
() -> kotlin.Unit
999
高阶函数interesting