Kotlin開發四 kotlin中的高階函式
阿新 • • 發佈:2018-11-01
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的地位和函式相當