Java转Kotlin:Lambda表达式

1 匿名函数

  • 普通函数
//Kotlin
fun f1() {
    println("Hello")
}
复制代码

以上是一个省略了函数类型的普通函数,该函数有本身的名字f1,函数类型是()->Unit函数

  • 匿名函数
//Kotlin
val f2 = fun() {
    println("Hello")
}
复制代码

以上赋值号右边是一个没有函数名的匿名函数,能够赋值给变量f2,执行f2()或者f2.invoke()来调用该匿名函数。ui

与普通函数同样,该匿名函数的函数类型是()->Unitspa

2 Lambda表达式

Lambda表达式本质上是一种更具表现力的匿名函数3d

2.1 Lambda表达式定义

图中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")
}
复制代码

2.2 Lambda表达式类型推导

  • 若Lambda表达式无输入参数,则其类型()->Any?能够省略
  • Lambda表达式的最后一行表达式的类型就是整个表达式的返回类型

好比:编译器

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

总之,必定要让编译器可以推导出传入参数的类型。

小结

相关文章
相关标签/搜索