为何咱们须要学习函数式编程?或者说函数式编程有什么优点?这个系列中我会用 scala 给你讲述函数式编程中的优点,以及一些函数式的哲学。不懂 scala 也不要紧,scala 和 java 是相似的,在每篇的开头我也会先说明这节中用到的 scala 语法。java
如 Python 同样,函数式编程(FP,即Functional Programming)也是近几年才逐渐为人们所知,但它并非一个多么新的概念。它拥有和面向对象编程(OOP)几乎等长的历史。但纵观每件事的脉络,老是有缘由的,函数式编程这几年变火的缘由是什么呢?编程
最主要的缘由是摩尔定律的逐渐失效,计算机的发展道路趋向于多核 CPU 与分布式的方向。咱们常用的面向对象编程的优点在于可以很好得对要解决的问题领域进行建模,但它在多线程编程环境下的同步阻塞调用,以及由此带来的线程安全问题,与函数式编程自然适合分布式并发编程的编程方式相比,当真相形见绌。而将来明显是大数据的时代,故而函数式编程只会越加剧要,甚至将来多是函数式编程的时代。设计模式
摩尔定律:1965年,英特尔公司创始人戈登·摩尔提出,在至多10年内,集成电路的集成度会每两年翻一番,即摩尔定律。后来这个周期被缩短到了18个月。也就是说,每隔18个月,计算机等IT产品的性能就会翻一番;或者说相同性能的计算机等IT产品,每18个月价钱会降一半。几十年来IT行业的发展始终遵循着摩尔定律预测的速度。安全
有一篇有趣的文章,或许可让你对函数式编程有所了解,能够先看看它,稍后再看看对函数式的正式定义,函数式编程圣经。多线程
所谓函数式编程,其实就是以纯函数的方式编写代码,纯函数的定义以下:并发
纯函数:一个函数在程序的执行过程当中除了根据输入参数给出运算结果以外没用其余影响,就能够说是没有反作用的,咱们就能够将这一类函数称之为纯函数。机器学习
纯函数最核心的目的是为了编写无反作用的代码,它的不少特性,包括不变量,惰性求值等等都是为了这个目标。那什么叫作无反作用呢?咱们用一个例子来看看。分布式
class Cafe { //用户购买一杯咖啡执行的函数 def buyCoffee(Cc: CreditCard) : Coffee = { val cup = new Coffee() //反作用所在,除了返回一杯咖啡,它还去通知信用卡公司扣费 cc.charge(cup.price) cup } }
这个函数的反作用是什么呢?就是在购买了一杯咖啡的时候使用信用卡去计费,它会通知信用卡公司去进行一系列处理。函数式编程
这样会致使什么问题呢?首先,反作用会让这段代码变成线程不安全。其次,会让这段代码难以测试,若是想测试这段代码的逻辑,就不得不每次都让信用卡扣费。但咱们只是想测试一下逻辑而已,并不想真正扣费。再者,当你想要一次购买多杯咖啡的时候怎么办,你只能跳脚。
这时候咱们再看看函数式的方式去实现:函数
case class Charge(cc: CreditCard,amount: Double) class Cafe{ def buyCoffee(cc:CreditCard) : (Coffee,Charge) = { val cup = new Coffee() (cup,Charge(cc,cup.price)) } }
看到了吗,通过咱们这样改变以后,函数变得没有反作用了。也就是说,不管执行这个 buyCoffee 函数多少次,它只会返回给我一杯咖啡以及它的价钱,这样咱们就能够很方便得对它的逻辑进行测试而没必要担忧影响到信用卡。而且它能够安全得运行在多线程环境下。
其实从面向对象的角度来看,这是否是有点像面向对象里面的一些设计模式呢?这样作解耦了咖啡和信用卡之间的关系,在后面添加其余功能的时候咱们能够方便得进行组合,好比说想要有一个多杯咖啡计费的功能,若是是用上面那段代码来实现需求,那么无疑会很痛苦。但经过函数式的方式改编后,一些变得清晰起来~
从这个角度来讲,函数式编程其实也能够是一种编程思惟,它没法帮你当即得到更好的职位,但却能够从某种程度上改变你编程的思惟,让你写出更优秀的代码。
最近几年,不少新火起来的概念,但它们其实早在上世纪就已经被发明出来,不管时机器学习,深度学习,Python语言,仍是函数式编程。这是为何呢?这是由于这些技术的边界发生变化,或者说这个时代的技术边界变了。
每一个时代都有每一个时代的技术边界,真正的工程师会知道边界在哪里,只有外行才会没法无边。巴菲特说他不投资本身不懂的东西,正是由于他给本身的划定了一个边界。
苹果公司可以成功的一个重要缘由正是由于它清楚得知道时代的边界,而且能在边界内作到最好。你看苹果不少产品都具备划时代的意义是吧,但其实那些产品都不是苹果独创,好比智能手机,最先是日本公司 DOCOMO 发明,我的平板电脑是英国首先发明。IPod,MP3 也是韩国先出品的。苹果公司用的不少技术甚至在 30 年前就有了,但为何直到被发明出来才为人们所知?
正是由于苹果了解时代的技术边界,并在边界内作到最好。
往小了说,当咱们在学习新的技术,或是使用新技术完成某项工做的时候,咱们必定要直到它的边界在哪里。往大了说,咱们应该像苹果同样,多多思考这个时代的技术边界在哪里,这样才不至于陷入无休止的技术追赶之中。