從本質上說: 閉包 == 函數 == 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 是等價的