kotlin-高階函數

定義:一個用函數作爲參數或者返回值的函數
如何定義:()->Unit 括號裏面代表函數的參數,箭頭後面代表函數的返回值。
傳遞一個函數,或要將這個函數賦值給一個變量的時候,需要在函數前面加雙冒號。
這個雙冒號的寫法,叫函數引用Function Reference
加了兩個冒號,這個函數才變成了一個對象。
在kotlin裏 [ 函數可以作爲參數 ] 這件事的本質是函數可以作爲對象存在。
因爲只有是對象纔可以被作爲參數傳遞。
kotlin中函數就是函數,不是對象。
kotlin選擇創建一個和函數具有相同功能的對象(用雙冒號)。
一個指向對象的引用。
這個對象不是函數本身,而是一個和這個函數具有相同功能的對象。
怎麼相同?你可以怎麼用這個函數,就可以怎麼用它(加了雙冒號的對象)。
只有函數類型的對象,才能調用invoke(在函數對象後面直接加括號是kotlin的語法糖)。
函數就是函數,它和對象是兩個維度的東西。
雙冒號表達的是它是一個指向對象的引用,而不是指向函數本身。
而是指向一個我們在代碼中看不見的對象。
這個對象複製了原函數的功能。

fun a(params: (Int) -> String) {
    println("aaa")
}

fun b(int: Int): String {
    return "acb"
}

fun main() {
    a(::b)
    val c = ::b
    c.invoke(1)
    c(2)
}

除了用雙冒號引用,還可以直接把函數挪過來寫
這種寫法叫匿名函數
注:d不是函數的名字,而是變量的名字,指向這個匿名函數類型的對象。

val d = fun(param: Int): String {
    return param.toString()
}

val z : (Int)->String = {
     it.toString()
}

val y: () -> Unit = {
    println("hahaha")
}

val w = {
    println("???")
}

如果Lambda是函數的最後一個參數,可以把lambda寫在括號外面,
而如果lambda是函數唯一的參數,可以把參數省略,用it指代這個參數
lambda的返回值不是用return,而是取最後一行代碼的值

kotlin的匿名函數其實不是函數,而是個對象,它和(::+函數名)是一個東西。
同理Lambda也是一個函數類型的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章