Kotlin高阶函数进阶
2020-08-31 本文已影响0人
竖起大拇指
Kotlin函数可以作为参数传递吗?
答案是可以的。但是我们知道kotlin的这种特性其实也是一种语法糖,它并不能突破jvm的限制,也就是说jvm不支持函数作为参数传递,那么kotlin也是不支持的,但是kotlin可以通过语法糖的方式,让kotlin的开发者认为kotlin中可以将函数作为参数传递。
//参数为函数类型的函数 高阶函数
fun highFunc(funParam: (Int) -> String): String {
return funParam(100)
}
//函数highFunc的参数就是一个函数,这个函数的参数必须是Int,返回值必须是String
//kotlin的高阶函数就是如果一个函数的参数或者返回值是函数类型的参数那么他就是kotlin中的高阶函数。
我们看看如何使用高阶函数。
companion object{
fun highFunc(funParam: (Int) -> String): String {
return funParam(1)
}
fun paramFunc(param:Int):String{
return param.toString()
}
//(Int)代表这个函数有个整型的参数,String代表这个函数返回值是String类型
val d1:(Int)->String={
params:Int->params.toString()
}
val d2:(Int)->String={
it.toString()
}
val d3= {
param: Int->param.toString()
}
@JvmStatic
fun main(args: Array<String>) {
//当函数作为一个参数传递进去的时候,必须使用::这个符号,其实这个符号
//就代表此时函数已经变成了一个对象
highFunc(::paramFunc) //只有作为对象,函数才可以被传递
val c=::paramFunc //加上::就表示这个一个指向对象的引用 加上::那就是对象了,不再是一个函数。c指向了一个函数类型的对象
//调用1:
c(1)
//调用2:
c.invoke(1)
}
}
这里我们得出一个结论:Kotlin中的函数作为参数传递的时候,其实本质上传递的是一个对象
那既然传递的是一个对象,也可以支持传递匿名对象。
//这里函数调用传递的就是一个匿名函数
//这个fun后面没有名字,只有参数和返回值
highFunc(fun (param: Int): String {
return param.toString()
})