?【匿名函数】
函数字面值:
????????一个函数体,或者说是一段代码,本身没有名字,我们可以把它绑定到一个变量上,通过这个变量操作它,Lambda表达式和匿名函数都叫函数字面值。
//匿名函数,必须有一个变量来接收
val sayHi = fun (name: String) = println("名字是:$name")
函数类型:
????????在kotlin语言,对类型这个概念进一步抽象了,类、基本类型都是类型,匿名函数也能抽象出类型,叫函数类型。既然函数可以抽象成一个类型,那么函数类型就可以作为方法的参数传递了。
//show 是函数类型的变量,(Int, Int) -> Int?是函数类型, { a, b -> a + b } 是变量的值
val show : (Int, Int) -> Int = { a, b -> a + b }?
//函数类型作为方法的参数
fun test(a: Int, b: (Int, Int) -> Int): Int {
return a + b(2, 3)
}
//简写
fun test2(a: Int, b: (Int, Int) -> Int) = a + b(2, 3)
【好处】
? ? ? ? Java 中定义工具类方法的时候,一般把这些方法定义成类方法。在 Kotlin 中直接在文件中定义方法就行,不用类包裹了,不过编译器最后还是把它编译成了类方法。
【写法】
①无参数的情况:
val/var 变量名 = { 操作代码?}
②有参数的情况:
写法一:完整的参数类型标注与表达式返回值
val/var 变量名 : (参数1 : 类型, 参数2?: 类型, ...) -> 返回值类型 = { 参数1, 参数2, ... -> 操作代码 }
写法二:当推断的返回值类型不为 Unit 时,即为 -> 后面代码的最后一个表达式的类型
val/var 变量名 = {?参数1: 类型, 参数2: 类型, ... -> 操作代码 }
fun test1(a: Int, b: Int): Int { return a + b } //普通函数
fun test2(a: Int, b: Int) = a + b //简写
val test3: (Int, Int) -> Int = { a, b -> a + b } //匿名函数,写法一
val test4 = { a: Int, b: Int -> a + b } //匿名函数,写法二
|