Kotlin閉包,擴展函數

Kotlin閉包,擴展函數

從本質上說: 閉包 == 函數 == Java Lamda 表達式 == Java 只有一個方法的類或接口閉包

閉包和函數的參數列表及返回值類型相同時能夠相互轉化函數

閉包定義

格式:this

{ 調用參數列表  ->
	執行體,最後一句返回值
}

code

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 屬性和方法接口

格式:it

fun  接收者類型 . 擴展函數名 (參數列表) : 返回值類型 {
	函數體
}

調用擴展

接收者 . 擴展函數名 (參數列表)

方法

//
fun String.myfun( i: Int) : Int {
	return this.length * i		// this 指向接收者對象
}

"hello".myfun(2)	// 得10

擴展函數 和 接收者爲第一個參數的普通函數 是等效的error

擴展函數能夠做爲參數傳給其餘函數

// 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 是等價的
相關文章
相關標籤/搜索