我对高阶函数的思考

来源:互联网 发布:淘宝V6会员网贷 编辑:程序博客网 时间:2024/05/17 04:19

最近在学习kotlin这门语言的时候,发现这门语言的不少特性,让我重新认识编程这个工作。尤其是高阶函数这个概念,对我影响很大,因此在这里谈谈kotlin中的高阶函数给我的启发吧。

高阶函数

简单的说,高阶函数就是可以接受函数作为参数或者返回一个函数的函数。在kotlin中最能体现这一点的就是各种数据结构数据的map,reduce等操作方法。

看到这里如果认为这个特性就是用来简化迭代操作的话,那就太浪费了。

下面我来介绍一下我在android开发中遇到的一个问题。来进一步说说我对高阶函数的思考。
这里我要封装了一段对RadioGroup操作的代码

val group = RadioGroup(context);for(int i = 0;i<infoList.size();i++){    //创建view    val view = View(group);//简略写法    view.text = infoList.get(i).name;    //-----    group.add(view)}

这里使用简略的写法,这里的主要意思是,创建group中的view,然后将view填充到group当中。如果我要封装这段代码,这段代码在其他地方上会不一样的地方就是for循环内部的代码。如果封装的话就可以写成

fun groupAdd(List<View> viewList){    val group = RadioGroup(context);    viewList.forEach{        group.add(it);    }}

但是,在这里我发现这样的封装是不行的,因为view的创建要用到group这个对象,而这里group的创建在具体的代码中,应该封装起来,所以这里就麻烦了。但是这里如果可以用到高阶函数的特性的话,就简单了。

fun groupAdd(init:(RadioGroup)->List<View>){    val group = RadioGroup(context);    init(group).forEach{        group.add(it)    }}

这样就解决了,在group不暴露出去的同时,创建了view,很好地隐藏了细节,让外部的代码关注于自己的功能就行。

这里的高阶函数的价值就不仅仅简化迭代了,它真正的价值,是将函数拆分出来的同时,功能上,增强了代码的灵活性,降低了代码的复杂度,这样易于维护和测试,心理上,也让我们能更专注于实现某一块功能,代码写起来就轻松了。比如,将初始化View的函数给独立出来,这样在编写groupAdd方法的时候,我们就不用考虑的init的实现,在写init的实现时,不用去考虑group怎么去弄的问题,测试时,如果init的返回值没问题,那么错误就是groupAdd,大大减少修bug要看的代码量。

在这里,我联想到spring学到的ioc的概念,对比上面这段代码,这不就是将init函数的控制权交给了groupAdd函数了吗?往大了想,如果我要写一个复杂的功能之类,这样我们就可以通过高阶函数的特性,去实现一个ioc的模式,比如我可以将一些函数让外面的实现,而我要写的就是如何去控制这些函数的输入输出。想想都觉得激动!!