都2021年了,你不会还只会拼kotlin吧?(高阶函数,函数式编程)

737 阅读4分钟

自从谷歌官宣kotlin成为Android开发的首选语言后,kotlin似乎成了老javaer们一道不得不迈的槛。如果半年前你问我kotlin是什么,我大概会跟你说

噢噢,kotlin啊,和java一样也是会编译成字节码,运行在jvm上的。好像有挺多很牛逼的特性,用起来很方便?

如果你再我问,我会淡淡回你一句

会拼kotlin这个单词算不算了解?

不是臣妾不想学啊,每天改也改不完的bug,做也做不完的需求,项目里5,6年前的老代码堆积如山,臣妾做不到啊啊啊!!!

好吧我摊牌了,我就是不想学。毕竟不知道猴年马月才能用到,学了还要忘,有那个时间是妹妹不好看还是游戏不香?

一切的转变发生在半年前,当leader和mentor带着死亡凝视和迷人微笑盯着你时,我只能战战兢兢颤颤巍巍放下快乐的双手走向kotlin的世界..

太多零散琐碎的东西想必写了各位帅气的哥哥们也不会看,我就挑一两点比较有代表性的

方法是一等公民

我们经常听到身边一些大佬激烈的争论,什么面向对象天下第一,函数式编程才是未来。kotlin可以说是面向对象和函数式编程的一个结合体。面向对象当然是因为它兼容java,而函数式编程就是它更高级的秘诀。在kotlin的世界中,方法(函数)是一等公民。

一等公民就是最重要的东西。

我们回想一下java世界中,什么是东西最重要?我认为是对象的属性。在开发过程中我们使用的最多的是属性,方法更多是我们处理属性的一个过程。在java世界中,方法永远停留在那里,等着我们传给他一个值,然后老老实实返回一个结果。

kotlin不是这样。在kotlin的世界里,方法可以像属性一样自由传递,自由飞翔。方法只是一个处理数据的过程,我可以给一个方法的形参传递一个方法,得到的结果可以是一个数据,也可以是一个方法。

上面那句话听起来不像人话,那就用代码来表示

class Bob {
    fun makeCar(money: Int): String {
        return "俺会造车"
    }
}

class Ace {
    fun makeHouse(monkey: Int): String {
        return "爷能盖房子"
    }

    //我会偷
    fun woHuiTou(monkey: Int, makeCar: (Int) -> String): String {
        return makeCar.invoke(monkey)
    }
}

就说有两个人,一个叫Bob,一个叫Ace。Bob呢老实憨厚,会造车,Ace会盖房子。有一天Ace心里不平衡了,“你说我连房子都会盖了,难道连一辆小小的车造不出来吗。”

于是Ace就想办法偷到了Bob造车的技能。运行一下就是

fun main() {
    val bob = Bob()

    val ace = Ace()
    ace.woHuiTou(100, bob::makeCar)
}

方法是第一公民的含义,就是指方法可以像引用一样被传递

这也叫高阶函数。bob::makeCar 表示bob造车的技能传给了woHuiTou方法的形参makeCar。然后makeCar调用invoke方法去执行。

方法的类型和传递

把方法作为参数 这看上去很神秘,很了不起。其实只要搞清楚方法的类型是什么就很简单了

前面说方法也可以像属性一样被传递,既然是属性就要有类型,方法的类型是什么呢?

别急,这个问题可以换另一个问题回答

在java中,如果让你传递一个方法,你会怎么做?

最简单的当然是把方法放在一个对象中,然后传递对象的实例,在需要执行的时候调用对象方法

哥哥好牛逼啊!!kotlin也是这么实现的!Kotlin用Function对象包装了我们要传递的方法,Function对象就是方法的类型。

图 1

Function2表示传入的参数是2个。P1,P2表示传入的类型,R是返回的类型

至于方法的传递上面大家已经知道了,靠的是方法的引用。两个冒号 :: 是kotlin的语法,bob::makeCar 表示对某个实例对象方法的引用。

这就是什么高阶函数,函数式,组合式编程。其实就这么简单。当然也是kotlin区别于java的地方

当然,Kotlin还有其他更令人惊叹的优势,比如扩展函数,协程等等,这些就等下次和各位帅气的哥哥们分享啦

我是方木

一个在互联网世界挣扎向上的打工人

努力生活,努力向前

如果觉得还不错的话欢迎关注我,我会尽力不让你失望~