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的地位和函数相当