什么是函数式编程
2016-07-07 18:33
232 查看
门
java8出来后,特意了解它的新特性lambda表达式,由此头一次听说了函数式编程这个词,听起来挺高深的样子。也曾各种搜索去了解它的来龙去脉。甚至买了一本书《函数式编程思想》,并在部门内进行了一次讨论。此时,首先需要回答的问题便是函数式编程:那是什么东西?
为此,我逛过百度,各种博客,知乎,github,但没有看到一个直接的答案,大多是列举函数式编程的特性,优点,理解能力有限,在多次思考之后,某一天突然顿悟了。
是什么
首先,举个栗子:这几年大数据很火,在java中,有一个它的代名词hadoop,它的编程模型叫做MapReduce,
什么是MapReduce呢,想象下有个图书馆,里面有十排书架,我想统计下有多少书,需要一个个数,如果用更快的方式怎么做。
找十个人,每人数一排;
将每个人的结果求和;
用MapReduce写一下这个问题
首先定义两个方法 map reduce
map() //对数据执行分批并行操作 reduce() //对操作所有返回值求结果然后是数书的操作定义两个方法
countBook() //数一排书 sum()//求和那么这次数书操作可表示为
map(countBook()).reduce(sum())ok,再进一步,现在我们有了map,reduce两个方法,下面可以进行花式数书了,我想统计下数学书
定义方法
countMathBook();你会很快写出
map(countMathBook()).reduce(sum());但是,我们需要拥抱变化,所以现在需求变了,我想知到十个书架中,书最多的书架的是哪一个
因此方法在此
max() //求最大值 map(countBook()).reduce(max())然后需求又变了我想知到十个书架中,数学书最多的书架的是哪一个
现在不需要考虑了
map(countMathBook()).reduce(max())我想要求最小的呢
map(countBook()).reduce(min())我想要求红色书的数量呢
map(countRedBook()).reduce(sum())…
花式数书结束,现在我们可以回答下什么是函数式编程了。
首先map,reduce本身不是这次数书所定义的业务方法,而是语言比如java的jdk自带的api,java8之后,在原有的函数库中,新增了许多像map,reduce这样抽象的方法,或者说函数,我们更愿意称之为高阶函数,这些抽象的方法可以为我们屏蔽底层的运算细节。
比如怎么分批数书,我们不需要考虑怎么分批数,只要传入一批怎么数的函数就行。也不要在意求和的过程,只要传入求和的函数。
所以,函数式风格的编程就可以这么定义。
将业务逻辑细化,抽象,封装成一个个功能函数,并借助语言自带的高阶函数api,将整个业务流程转化为函数之间的相互调用,这就是函数式编程。
我们可以看到,函数式编程中,函数不仅直接调用,也可以当成参数被其他函数调用。
因此,进一步,如果我不仅想把函数当参数,还想传入值,所以再封装一下,函数和值封装后是什么。
函数->行为
值->属性
没错就是这就是对象
将业务逻辑细化,抽象,封装成一个个对象,并借助语言,库,组件,框架等,将整个业务流程转化为对象之间的相互调用,这就是面向对象编程。
因此,这么看来,函数式跟面向对象的思想其实都是一致的,即对逻辑的抽象与封装。
原点
回顾下语言的历程过程式->函数式->面向对象
近年来大数据的兴起,数据的处理往往跟面向对象没关系,更多的是简单而大量的数据结构,借助mapreduce这样的高阶函数处理更加方便,这也是函数式编程又火起来的原因。
程序只不过是回到了它的原点:
算法+数据结构->函数+高阶函数+数据。
作者:初龙
原文链接:https://chulung.com/article/what-is-functional-programming
本文由MetaCLBlog于2017-07-17 09:02:08自动同步至cnblogs
本文基于 知识共享-署名-非商业性使用-禁止演绎 4.0 国际许可协议发布,转载必须保留署名及链接。
相关文章推荐
- MyBatis中的in条件查询的用法代码示例
- Eclipse+PyDev搭建Python环境
- java字符串应用之IP地址转换成整数
- 文本文档提取字符串
- Eclipse 插件安装之Findbug
- qt中的各种workaround
- 聚类算法小记
- java的热部署和热加载
- Java多线程深度探索
- java I/O流(3) File类续 遍历文件
- python3:各种转换
- 转boolean时,值为假的情况
- Java面向对象
- 【JUnit 报错】java.lang.IncompatibleClassChangeError
- SDKD 2016 Summer Single Contest #02.B
- Python3.5 如何安装对应版本的numpy
- gradle添加新的代码仓库
- 关于两个php.ini的说明
- [NOIP1999]拦截导弹
- Java Swing 使用总结(转载)