Kotlin闭包,扩展函数
从本质上说: 闭包 == 函数 == Java Lamda 表达式 == Java 只有一个方法的类或接口
闭包和函数的参数列表及返回值类型相同时可以相互转化
闭包定义
格式:
{ 调用参数列表 ->
执行体,最后一句返回值
}
如
var f0 = { x: Int, y: String ->
x = x + 1
y + x // y+x 的结果将为返回值
}
z = f0( 1, "hello") //将闭包当场函数调用
val k: ( (Int,String)->String ) = f0 //OK
val l: ( ()->Unit ) = f0 //error, l 的类型与 x的类型不同
fun f1( a1: Int, a2: String): String {
return "world"
}
f0 = f1 //OK , 函数的类型与闭包的类型相同
只有一个参数的闭包 可以省略 调用参数列表 ->
, 隐含的实际参数为 it
var f0: (String)->Unit = {
println( it ) // it 代表传入参数
}
f0("hello") //打印出 hello
扩展函数可以给已存在的对象添加不存在的方法
扩展函数的本质是隐藏的 接收者 的函数,并不能调用 接收者 的 private
属性和方法
格式:
fun 接收者类型 . 扩展函数名 (参数列表) : 返回值类型 {
函数体
}
调用
接收者 . 扩展函数名 (参数列表)
如
//
fun String.myfun( i: Int) : Int {
return this.length * i // this 指向接收者对象
}
"hello".myfun(2) // 得10
扩展函数 和 接收者为第一个参数的普通函数 是等效的
扩展函数可以作为参数传给其他函数
如
// f 是扩展函数
fun my( f : String.(Int)->Unit ) {
"abc".f(1) //
f("abc",1) //和上一句的效果相同
}
val f1 = { a1: String, a2: Int ->
//
Unit //返回Unit
}
my( f1 ) // OK, f1的类型为 (String,Int)-Unit , 与 String.(Int)->Unit 是等价的