内容简介:Filename:_Collections.kt/Iterator.kt我主要写Kotlin源码阅读,函数式编程的基本概念,概念大家可以在网上做一些了解,这里推荐一下百度百科的定义,无论何种语言,一般都会提供map/reduce/filter等三大类函数式模型,比如JavaScript/Python/Dart等都是有的,C++也有但是支持地并不是那么友好,废话不多说,开始。
Filename:_Collections.kt/Iterator.kt
我主要写Kotlin源码阅读,函数式编程的基本概念,概念大家可以在网上做一些了解,这里推荐一下百度百科的定义, 函数式编程概念 ,蛮清晰的。
无论何种语言,一般都会提供map/reduce/filter等三大类函数式模型,比如JavaScript/Python/Dart等都是有的,C++也有但是支持地并不是那么友好,废话不多说,开始。
1.map
概念:映射函数,将一个集合经过传入的变换(transform)函数,映射成另外一个集合。
下面,我们来写一些demo,计算一个字符串数组每个字符串的长度。
简单的代码如上,map函数是直接作用在myStringList上的。我们看一下map的具体实现。
由于函数式编程,是没有副作用的,输入一样,输入也一定一样,所以map的返回值是new出来的对象。
这里新对象构建ok,就看一下map到底是怎么遍历的,一揭函数式编程FP的神秘面纱。
我们知道,最终还是调用的命令式,for语句,我们看到了源码,知道最终是怎么实现的了,所以觉得函数式编程没有什么神秘了吧。
这里想提一个问题,在上一张图,给新数组默认初始值是10,如果这个case走到了,那么容器初始值是10,如果新数组的长度超过了10,怎么办呢?Kotlin的ArrayList是复用 Java 的ArrayList,这里就涉及到了Java JVM ArrayList的扩容逻辑啦,感兴趣的小伙伴,可以自行浏览一下ArrayList的源码实现。
再上一张源码截图,我们发现map的兄弟还是挺多的,我们再来分析一个mapIndexedNotNull函数吧,以增加熟悉程度。
先看一下mapIndexedNotNull的函数定义:
如图,我们知道这个函数,相比于map有两个特点:
a)遍历的时候,带下标index。
b)只包含transform不为空的item。
废话不多说,直接上代码:
如图,我们看到,a)是通过index = 0,然后++实现的,而item使用this中取出来的,那b)是如何实现的,请看第一个截图的?.问号表达式,意思是如果为null就不执行let的函数体。
运行结果:
2.reduce
第一大类的map,我们很容易理解,就是遍历+映射。那么这里的reduce怎么理解呢?我觉得这里应该是遍历+累积,废话少说,代码最清楚。
Demo如上图。
看一下reduce的源码,从注释看,我们知道这个函数是从第一个元素开始,从左到右地累积执行传入的operation函数,比如求和,阶乘等都是这种概念。这里源码非常清晰明了,就是获取第一个元素,如果没有,就抛出异常,然后取第一个元素作为积累的初始值,然后循环执行operation,赋值给“初始值”,直至循环完毕。
同样,reduce的其他“兄弟函数”,也是差不多的,这里就不做过多重复分析了。
3.filter
二话不说,先上代码。
这是简单的一个filter demo,过滤出字符串长度是偶数的字符串。
看一下内部实现filterTo,又是new一个ArrayList(无副作用)
下面的截图,还用说太多嘛,就是往新的ArrayList中添加符合predicate lambda条件的元素。
所以,filter就是一个语法糖的封装,并不神秘。
同样filter也有一大家子的兄弟。
大致都是一样,只不过又封装了非空或者是not而已。
总结一下:
函数式编程,在我看来是一个新思路,新的编程模型,简单,简洁,但是内部实现也都是通过命令式来实现的,鼓励大家多用,多写优雅可读的代码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Vue源码: 构造函数入口
- Hashmap源码解析-构造函数
- Hashmap源码解析-扩容函数
- PHP 源码 — is_array 函数源码分析
- Vue 源码中一些util函数
- 深入理解 lambda表达式 与 函数式编程 函数式接口源码解析(二)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
形式感+:网页视觉设计创意拓展与快速表现
晋小彦 / 清华大学出版社 / 2014-1-1 / 59.00元
网页设计师从早年的综合性工作中分化出来,形成了相对独立的专业岗位,网页设计也不再是单纯的软件应用,它衍生出了许多独立的研究方向,当网站策划、交互体验都逐渐独立之后,形式感的突破和表现成为网页视觉设计的一项重要工作。随着时代的发展,网页设计更接近于一门艺术。网络带宽和硬件的发展为网页提供了使用更大图片、动画甚至视频的权利,而这些也为视觉设计师提供了更多表现的空间。另外多终端用户屏幕(主要是各种移动设......一起来看看 《形式感+:网页视觉设计创意拓展与快速表现》 这本书的介绍吧!