为什么我们需要学习函数式编程?或者说函数式编程有什么优势?这个系列中我会用 scala 给你讲述函数式编程中的优势,以及一些函数式的哲学。不懂 scala 也没关系,scala 和 java 是类似的,在每篇的开头我也会先说明这节中用到的 scala 语法。
为什么函数式编程这几年火起来
如 Python 一样,函数式编程(FP,即Functional Programming)也是近几年才逐渐为人们所知,但它并不是一个多么新的概念。它拥有和面向对象编程(OOP)几乎等长的历史。但纵观每件事的脉络,总是有原因的,函数式编程这几年变火的原因是什么呢?
最主要的原因是摩尔定律的逐渐失效,计算机的发展道路趋向于多核 CPU 与分布式的方向。我们经常使用的面向对象编程的优势在于能够很好得对要解决的问题领域进行建模,但它在多线程编程环境下的同步阻塞调用,以及由此带来的线程安全问题,与函数式编程天然适合分布式并发编程的编程方式相比,当真相形见绌。而未来明显是大数据的时代,故而函数式编程只会越加重要,甚至未来可能是函数式编程的时代。
摩尔定律:1965年,英特尔公司创始人戈登·摩尔提出,在至多10年内,集成电路的集成度会每两年翻一番,即摩尔定律。后来这个周期被缩短到了18个月。也就是说,每隔18个月,计算机等IT产品的性能就会翻一番;或者说相同性能的计算机等IT产品,每18个月价钱会降一半。几十年来IT行业的发展始终遵循着摩尔定律预测的速度。
函数式编程思想介绍
有一篇有趣的文章,或许可以让你对函数式编程有所了解,可以先看看它,稍后再看看对函数式的正式定义,函数式编程圣经。
所谓函数式编程,其实就是以纯函数的方式编写代码,纯函数的定义如下:
纯函数:一个函数在程序的执行过程中除了根据输入参数给出运算结果之外没用其他影响,就可以说是没有副作用的,我们就可以将这一类函数称之为纯函数。
纯函数最核心的目的是为了编写无副作用的代码,它的很多特性,包括不变量,惰性求值等等都是为了这个目标。那什么叫做无副作用呢?我们用一个例子来看看。
咖啡店购物的例子 --scala
先来看一段有副作用(非函数式)的代码
class Cafe {
//用户购买一杯咖啡执行的函数
def buyCoffee(Cc: CreditCard) : Coffee = {
val cup = new Coffee()
//副作用所在,除了返回一杯咖啡,它还去通知信用卡公司扣费
cc.charge(cup.price)
cup
}
}
这个函数的副作用是什么呢?就是在购买了一杯咖啡的时候使用信用卡去计费,它会通知信用卡公司去进行一系列处理。









