Java转Kotlin:Lambda表达式

1,622 阅读2分钟

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表达式的最后一行表达式的类型就是整个表达式的返回类型

比如:

但凡表达式输入参数,则一定要显式声明每个传入参数的类型,否则报错

总之,一定要让编译器能够推导出传入参数的类型。

小结