1. 程式人生 > >Kotlin開發四 kotlin中的高階函式

Kotlin開發四 kotlin中的高階函式

1 高階函式定義

在kotlin中任何以lambda或者函式引用為引數的函式,或者函式的返回值是lambda或者函式引用,就是高階函式
高階函式之前我們已經見過了,例如集合的map,filter等函式都是高階函式,我們可以開啟看下map的定義

public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}

注意看transform的型別,它是(T) -> R,它其實就是一個函式。下面先來介紹函式的型別

2 函式型別

在kotlin中,函式都是有型別的。例如如下這個函式

fun sum(x:Int,y:Int):Int{
    return x+y
}

它的型別就是{(Int,Int) -> Int},注意和lambda表示式的型別很像,只是多了一對括號。
因此學習高階函式,我們首先要弄明白函式的型別
高階函式一般有兩種,一種是函式引數是lambda或者函式引用,另外一種就是函式的返回值是lambda或者函式

3 引數是lambda的高階函式

下面就是一個函式引數是lambda的高階函式

fun main(args: Array<String>) {
    //傳遞lambda表示式
    highFunction1{
        a,b -> a+b
    }
    highFunction1{
        a,b -> a*b
    }
    //直接傳遞函式
    highFunction1(::multiply)
}

/**
 * 操作兩個數
 */
fun highFunction1(operation:(Int,Int)->Int){
    val result = operation(20,30)
    println("result: $result")
}

/**
 * 兩個數相加
 */
fun sum(x:Int,y:Int):Int{
    return x+y
}

/**
 * 兩個數相乘
 */
fun multiply(x:Int,y:Int):Int{
    return x * y
}

可以看到,高階函式可以直接傳遞lambda或者直接傳遞函式的引用

4 返回值是函式的高階函式

接下來介紹函式返回值是函式的高階函式,來看下面的例子

/**
 * 定義一個返回值是函式的高階函式
 * @param name 入場
 * @return 返回一個函式或者lambda
 */
fun highFunction2(name:String):(Int) -> Int{
    if (name == "A"){
        return ::returnFun
    }
    //返回lambda
    return {a -> a + 10}
}

/**
 * 作為高階函式的返回函式
 */
fun returnFun(a:Int):Int{
    return  a * 100
}

使用如下:

//使用高階函式
val res = highFunction2("A")
println(res(20)) //列印2000
val res2 = highFunction2("B")
println(res2(20)) //列印30

總結:如果是引數是函式型別的高階函式,可以傳函式的引用和lambda,如果是返回值是函式型別的高階函式,一般先接受高階函式的返回,再繼續呼叫。kotlin中lambda的地位和函式相當