kotlin學習(七)

高階函數:lambda作爲形參和返回值

一.聲明高階函數
高階函數就是以另一個函數作爲參數或者返回值的函數。
聲明函數類型,需要將函數參數類型放在括號中,緊接着是一個箭頭和函數的返回類型。

val sum : (Int, Int) -> Int = {x, y -> x + y}

定義一個有函數類型參數的函數

fun twoAndThree(operation : (Int, Int) -> Int){
    println(operation(2, 3))
}
twoAndThree{a, b -> a * b}//輸出6

另一個例子

fun String.filter(predicate : (Char) -> Boolean) : String {
    val sb = StringBuilder()
    for (index in 0 until length) {
        if (predicate(get(index))) sb.append(get(index))
    }
    return sb.toString()
}

println("asda1314asda".filter { it in 'a'..'z' })

其背後原理是,函數類型被聲明爲一個普通接口,一個函數類型的變量是FunctionN接口的一個實現

返回函數的函數,需要指定一個函數類型作爲返回類型

enum class Delivery {
    STANDARD,
    EXPEDITED
}
class Order(val itemCount : Int)
fun getFunction(delivery : Delivery) : (Order) -> Double {
    if (delivery == Delivery.EXPEDITED)
        return { order -> 6 + 2.1 * order.itemCount }
    else {
        return {order -> 5 + 2.3 * order.itemCount }
    }
}

println(getFunction(Delivery.EXPEDITED)(Order(3)))

二.內聯函數
如果使用inline修飾符標記一個函數,在函數被使用時編譯器不會生成函數調用的代碼,而是使用函數實現的真實代碼替換每一次的函數調用
在Java中調用內聯函數時,調用並不會內聯,而只是一個普通函數調用
通過noinline取消標記一個非內聯的lambda參數
使用內聯只會提高帶有lambda參數的函數的性能,其他情況需要分析

三.高階函數的控制流
如果在lambda中使用return返回,則會從調用lambda的函數中返回,而不只是從lambda返回。這種return稱爲非局部返回。
同樣的,也可以使用標籤返回。也可以使用函數名返回

fun labelTest(name : List<String>){
    name.forEach label@{
        if (it.equals("hello")) return@label//本例也可以使用return@forEach進行返回操作
    }
    println("over")
}

使用匿名函數則默認使用局部返回。類比於Java中的匿名內部類的方式。

總結下來就是,return從最近的fun關鍵字聲明的函數返回

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