1 匿名函数
- 普通函数
//Kotlin
fun f1() {
println("Hello")
}
以上是一个省略了函数类型的普通函数,该函数有自己的名字f1,函数类型是()->Unit。
- 匿名函数
//Kotlin
val f2 = fun() {
println("Hello")
}
以上赋值号右边是一个没有函数名的匿名函数,可以赋值给变量f2,执行f2()或者f2.invoke()来调用该匿名函数。
与普通函数一样,该匿名函数的函数类型是()->Unit。
2 Lambda表达式
Lambda表达式本质上是一种更具表现力的匿名函数。
2.1 Lambda表达式定义
图中Kotlin Lambda表达式的函数类型为()->Unit。Java中没有传入参数不能省略括号,Kotlin中能省略括号。
Java 8中也新增了Lambda表达式,Java 10中新增了类型推导var,但是Java中的Lambda表达式的类型无法进行类型推导,本质上是因为Java中的函数(方法)不是类型,不是“一等公民”。因此需要显示声明类型,一般定义一个SAM(Simple Abstract Method)接口来定义这个Lambda表达式的类型。
上图Java中的Lambda表达式就是利用了SAM来定义表达式的类型。
在Kotlin中,Lambda表达式的常规定义如下:
//Kotlin
val lambda0: () -> Unit = {
println("Hello")
}
val lambda1: (Int) -> Unit = {
println(it)
}
val lambda2: (Int, String) -> Unit = { i: Int, s: String ->
println("$i $s")
}
2.2 Lambda表达式类型推导
- 若Lambda表达式无输入参数,则其类型
()->Any?可以省略 - Lambda表达式的最后一行表达式的类型就是整个表达式的返回类型
比如:
但凡表达式输入参数,则一定要显式声明每个传入参数的类型,否则报错:
总之,一定要让编译器能够推导出传入参数的类型。