我对高阶函数的思考
来源:互联网 发布:淘宝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的模式,比如我可以将一些函数让外面的实现,而我要写的就是如何去控制这些函数的输入输出。想想都觉得激动!!
- 我对高阶函数的思考
- 我对我的思考
- 我对俱乐部的思考
- 我对"许霆案"的思考
- 我对师生关系的思考
- 对指针函数的思考
- 对应对高并发的一些思考
- 对我未来方向的思考
- 我对软件开发的一点思考
- 我对ERP行业解决方案的思考
- 我对中国现状的思考
- 我对单源最短路径的思考
- 我对FizzBuzz问题的小小思考
- 我对自己学习的思考
- 我对机器的一点思考
- 我对人工智能的哲学思考
- 【OnMyWay】我对智能家居的一些思考
- 我对学习的一些思考
- 2017ACM/ICPC广西邀请赛总结
- 图解MOS管的驱动技术及应用
- 面试基础题总结
- 杭电OJ_(2045)不容易系列之(3)—— LELE的RPG难题
- 操作系统概论
- 我对高阶函数的思考
- 证书
- ubuntu设置环境变量
- 一个不知名的项目--Day06
- 12.异常机制
- 操作系统安装文章收集
- 年终总结
- linux 下DNW 下载环境搭建
- 我要转行Linux驱动开发了,驱动开发的工作是什么样的情况,希望大神给点建议,也希望大家给我一点鼓励