函数式编程概述
如今主流的编程语言,函数式编程范式或多或少都融入其中成了“标配”,或者说主流语言都在进行函数式方面的扩充,这是一个大趋势。以Java为例,随着Lambda块和Stream API等这种高阶函数的加持,Java总算是装备了函数式这一利器;博大精深的C++也在2011版的语言标准里加入了Lambda块的支持;再比如前一段时间我初步体验了的
Groovy语言
,虽然其运行于JVM之上,然而其对动态语言、函数式编程范式以及元编程功能的加持所带来的表现力和简洁性可以说甩了Java几条街,可以利用Groovy的所有动态功能构建高性能的JVM应用、将开发效率提高几个数量级。语言的例子有很多,我不一一枚举。
为什么要使用函数式编程范式
这里讲几个函数式编程的典型特点,区别的对象那就是传统的命令式编程
0x01. 更高层次的抽象(高阶函数)
用高阶抽象来取代基本的控制结构本身就是一个全新的思考方式,这样可以让开发者聚焦精力于业务场景而无需费心复杂地层运作
举个栗子:将一个字符串集合中的所有单词转为大写,我们用Java语言来实现
如果按照传统的命令式编程的解法,那接下来不出意外我们得来写循环、遍历这种迭代操作了:
但如果使用Java的函数式编程范式,一切都是那么的优雅,一句话搞定
这里的map()函数就是所谓的高阶函数,我们用高阶函数代替了底层的迭代,因为我们并没有处理细节,我们仅仅定义了映射的逻辑,迭代由高阶函数来自动完成!
0x02. 提升代码信噪比(简洁性)
区别于面向对象语言用抽象来封装不确定因素、而函数式编程则通过直接尽量减少甚至消除不确定因素来使代码极度简洁
上面的例子对于本条优点的展现我想应该也不必多说了
0x03. 控制权转交于运行时(动态性)
区别于传统的编译形语言,配备函数式编程范式的动态语言更多的将控制权转交到语言运行时手里,获得的则是更高的灵活性、表现力和性能权衡。
这三点优点将在接下来的例子中切实的感受并领会!
函数式编程例析
举例1:词频统计
做的事情很简单:给定一个单词集合,统计出集合中除了助词(如 、 、 等)之外的单词出现的频次,不区分大小写
命令式解法:至少分为以下几大步
先进行循环迭代
然后统一将单词转为小写
然后判断单词是否是助词
最后进行词频统计
函数式解法:
如果我们用Java的Stream API和Lambda块所构成的函数式范式来重写 函数,一切都将如此简洁:
备注:这里的 是Java的Map提供的一个便利函数,意思是:在Map中若没有找到给定的key时,返回一个“默认值”
对比命令式解法,用户省去了很多繁琐的迭代和判断,我们只讲焦点聚焦在业务逻辑之上,代码信噪比提升不小吧!
举例2:连词成句
给定一个离散的单词集合,我们想将字母数大于1的单词的首字母大写后,用 短横线- 连接起来成为一个句子
命令式解法:
函数式解法1:Java Steam API 和 Lambda块实现
我什么都不想说了,这不要太简洁好吧!
函数式解法2:Groovy语言实现
函数式最佳实践:高效编写三行情书
还记得去年的520,为了表达心中对于老婆无限的、无法表达的爱,我想写一封不超过三行的代码情书,我更想用尽可能短的代码来尽可能多地表达,于是我选择了函数式编程。
我的520三行代码情书在此:
后记
如果有兴趣,也来看看作者一些关于容器化、微服务化方面的文章:
领取专属 10元无门槛券
私享最新 技术干货