什么是高阶函数
将函数作为参数或者返回值的,称高阶函数。
定义高阶函数
action是一个高阶函数,(Int) -> Int示意是函数的类型,(Int)示意函数入参类型为Int,前面的Int示意函数返回类型。
private fun init() { val action: ((Int) -> Int) = {//函数进行加100运算 it + 100 } }
函数作为参数
以下代码,init函数调用doSomething函数,将Int类型 0 以及action函数传入doSomething。doSomething函数先对入参0进行加200运算,而后调用高阶函数action(进行加100运算),最初打印后果actionResult。 是不是有点策略设计模式的滋味?是的,齐全能够用它来实现策略设计模式。
private fun init() { val action: ((Int) -> Int) = {//函数进行加100运算 it + 100 } doSomething(0, action)//将0以及action传给doSomething } private fun doSomething(d: Int, action: (Int) -> Int) { val data = d + 200//先对d进行加200运算 val actionResult = action(data)//将加200后的后果传给action,后果保留在actionResult中 Log.e("test", "actionResult=${actionResult}")//打印后果 }
函数作为返回值
以下代码,依据不同的类型type,返回对应的action,接着对参数0进行运算,最初打印后果。
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val action = init("计划1") //获取到对应的action,传入参数0进行运算 val result = action?.invoke(0) //打印后果 Log.e("test", "result=${result}") } private fun init(type: String): ((Int) -> Int)? { val action1: ((Int) -> Int) = {//加100运算 it + 100 } val action2: ((Int) -> Int) = {//加200运算 it + 200 } //依据类型type,返回对应的action return when (type) { "计划1" -> action1 "计划2" -> action2 else -> null } }
lamdba表达式
也是高阶函数,只不过函数是匿名的。以下代码性能跟上述一样,只不过用amdba表达式代替了定义action函数。
private fun init() { doSomething(0) { //将0以及lambda表达式传给doSomething it + 100//进行加100运算,并返回 }}private fun doSomething(d: Int, action: (Int) -> Unit) { val data = d + 200//先对d进行加200运算 val actionResult = action(data)//将加200后的后果传给action,后果保留在actionResult中 Log.e("test", "actionResult=${actionResult}")//打印后果}
高阶函数实质是什么呢?
将第一个例子反编译
private static final void init() { Function1 action = new Function1() {//1 @Override public Object invoke(Object o) { return ((Integer)o).intValue() + 100;//2 } }; doSomething(0, action);}private static final void doSomething(int d, Function1 action) {//3 int data = d + 200; int actionResult = ((Number)action.invoke(data)).intValue(); Log.e("test", "actionResult=" + actionResult);}
- 正文1:Kotlin编译器将高阶函数转成Function1;
- 正文2:对应高阶函数的实现;
- 正文3:调用高阶函数,其实就是触发invoke函数;
以上剖析有不对的中央,请指出,互相学习,谢谢哦!