//Kotlin fun f1() { println("Hello") } 复制代码
以上是一个省略了函数类型的普通函数,该函数有自己的名字 f1
,函数类型是 ()->Unit
。
//Kotlin val f2 = fun() { println("Hello") } 复制代码
以上赋值号右边是一个没有函数名的 匿名函数 ,可以赋值给变量 f2
,执行 f2()
或者 f2.invoke()
来调用该匿名函数。
与普通函数一样,该匿名函数的函数类型是 ()->Unit
。
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") } 复制代码