kotlin学习----高阶函数(入门级别)

我尽量不打错别字,用词准确,不制造阅读障碍

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 表达式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值