Kotlin闭包,扩展函数

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 是等价的

猜你喜欢

转载自my.oschina.net/u/181909/blog/1795648