//Kotlin
fun f1() {
println("Hello")
}
复制代码
以上是一个省略了函数类型的普通函数,该函数有本身的名字f1
,函数类型是()->Unit
。函数
//Kotlin
val f2 = fun() {
println("Hello")
}
复制代码
以上赋值号右边是一个没有函数名的匿名函数,能够赋值给变量f2
,执行f2()
或者f2.invoke()
来调用该匿名函数。ui
与普通函数同样,该匿名函数的函数类型是()->Unit
。spa
Lambda表达式本质上是一种更具表现力的匿名函数。3d
图中Kotlin Lambda表达式的函数类型为()->Unit
。Java中没有传入参数不能省略括号,Kotlin中能省略括号。code
Java 8中也新增了Lambda表达式,Java 10中新增了类型推导var
,可是Java中的Lambda表达式的类型没法进行类型推导,本质上是由于Java中的函数(方法)不是类型,不是“一等公民”。所以须要显示声明类型,通常定义一个SAM(Simple Abstract Method)接口来定义这个Lambda表达式的类型。cdn
上图Java中的Lambda表达式就是利用了SAM来定义表达式的类型。blog
在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")
}
复制代码
()->Any?
能够省略好比:编译器
但凡表达式输入参数,则必定要显式声明每一个传入参数的类型,不然报错:string
总之,必定要让编译器可以推导出传入参数的类型。