我尽量不打错别字,用词准确,不制造阅读障碍
kotlin我都用了很久了,基础语法糖的学习其实很快,虽然刚开始确实有些不习惯,还有些Java的写法不知道怎么用kotlin写,但是总的而言还是有惊无险的那种,网上找找就好了;这篇文章只是记录一些我学习kotlin高阶函数的理解;
Java也是有高阶函数的,网上一搜一大堆,说来惭愧,我没怎么用过,但是我学kotlin的时候就知道kotlin是有高阶函数的,所以就自然而然的想要去学习;网上找了一堆文章,但是这些大佬举的例子都是什么玩意,非得这么生僻吗,我都怀疑是抄kotlin官网的,此外,也看了扔物线大佬的讲解,讲的真好,就是话多,看着累,一旦打断,再接上就头疼了。
一.你必须知道概念----何为高阶函数?
一个函数,它的参数含有函数或返回值是函数,则可以称为高阶函数;这和数学中的高等数学里的高阶函数是一个意思,因为高等数学里也是用A函数参与表示B函数,那B函数就可以称为高阶函数
举个例子:
private fun heightFunTest(firstParams: String, secondFun: Fun):Fun {...}
这里实际并不能这么写啊,只是指代一下,笑哭~;上面的例子里,secondFun是个函数,返回值Fun也是一个函数,两个条件都满足了,根据定义,只要满足其中一个条件其实就可以了,这里只是举了一个完整的例子;
二.高阶函数的入门使用——参数是函数
OK,概念很容易理解,接下来无非就是怎么写了,这里就举几个简单的例子,方便入门理解,之后就是多写写,多看看,彻底掌握也就这么回事,当然可以从原理出发理解,但是面试也不会有人问这个吧?
例子一:最简单的
private fun heightFun(aa: String, com:(aa:Int, bb:Int) -> Int): Int {
return com(1, 2)
}
com是参数名字,不管参数是对象也好,函数也罢,总要有个名字吧,冒号不解释,和普通参数一样啊;之后就是很典型的lambda表达式的写法了(如果你不熟悉lambda表达式或者看着不习惯,那你理解这篇文章还是有些难度的)。后面小括号是函数的参数和相应类型(函数总要有参数吧),之后的箭头表示指定返回值类型,这里返回值是个Int型;其实就是下面这样:
fun com(aa:Int, bb:Int):Int {...} ===> com:(aa:Int, bb:Int) -> Int
理解起来没啥问题吧?之后我拿到这个函数后就是要使用这个函数了,就和使用一个参数一样。
怎么调用?最重要的函数体还没写呢,在这里:
heightFun("aa", { aa:Int, bb:Int -> aa + bb })
或者
heightFun("aa") { aa:Int, bb:Int -> aa + bb }
//如果函数的最后一个参数是函数,那么这个函数可以写到外面;但是我觉的上面更好理解
之前我们只是定义了一个函数,且这个函数可以接受“2个Int类型参数且返回值为Int类型的函数”,但是,具体的方法体还是要我们去定义的,这就和你定义了一个对象类型的参数:user:User, 那你可能就要先"new "一个User对象,再传入一样,总要做些事情;上面就是写了一个"参数为2个Int型,返回值为aa+bb结果"的函数,在lambda中,函数体最后一行为返回值,所以我们不用写“return”;
如果函数体中内容很长,这代码就太丑了,还不能复用,所以,函数可以单独拿出来:
private fun com2(aa: Int, bb: Int): Int {
return aa + bb
}
调用时:
heightFun("aa", ::com2)
这里的"::“看着很难受吧,Java可没有这个玩意, 这是什么意思呢,意思就是转成对象(按照扔物线大佬的说法),如果不加”::",一个com,kotlin也不知道是变量还是函数; 你看看,这个好像我们写的接口回调
heightFun("aa", object: aaa.listener(){}) //是不是长得有点像
一个"::"将函数转成了对象,而对象是可以有引用的,就像这样:
val cc = ::com
三.返回值为函数
举个简单的例子
private fun test(tt: String): (aa: Int, bb: Int) -> Int {
return ::com
}
这里规定了返回值是:以"2个Int类型的参数,且返回值为Int"的函数;正好我们有一个叫com的方法,满足这个要求,那就直接使用了,一般开发中都是这样,因为可以把函数单独写出来,好管理,也可以复用,还容易看懂;如果不这样写,那就只能新写一个函数了,像这样:
private fun test(tt: String): (aa: Int, bb: Int) -> Int {
return { aa:Int, bb:Int -> aa + bb}
}
本文到此结束; 其实我觉的,就是写法结合lambda比较花哨,如果不使用花哨的语法,正常写的话,也没什么难理解的。
最后附赠kotlin 中文网站对高阶函数的讲解:
高阶函数与 lambda 表达式