Scala函数式编程专题--函数思想介绍

 更新时间:2020年06月17日 15:54:56   作者:zzzzMing  
这篇文章主要介绍了Scala函数式编程的的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

为什么我们需要学习函数式编程?或者说函数式编程有什么优势?这个系列中我会用 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
 }
}

这个函数的副作用是什么呢?就是在购买了一杯咖啡的时候使用信用卡去计费,它会通知信用卡公司去进行一系列处理。

这样会导致什么问题呢?首先,副作用会让这段代码变成线程不安全。其次,会让这段代码难以测试,如果想测试这段代码的逻辑,就不得不每次都让信用卡扣费。但我们只是想测试一下逻辑而已,并不想真正扣费。再者,当你想要一次购买多杯咖啡的时候怎么办,你只能跳脚。

这时候我们再看看函数式的方式去实现:

函数式的咖啡店

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 年前就有了,但为什么直到被发明出来才为人们所知?

正是因为苹果了解时代的技术边界,并在边界内做到最好。

往小了说,当我们在学习新的技术,或是使用新技术完成某项工作的时候,我们一定要直到它的边界在哪里。往大了说,我们应该像苹果一样,多多思考这个时代的技术边界在哪里,这样才不至于陷入无休止的技术追赶之中。

相关文章

  • 深入分析java与C#底层控制能力区别及示例详解

    深入分析java与C#底层控制能力区别及示例详解

    这篇文章主要为大家深入分析java与C#底层控制能力不同的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • 详解敏捷过程中的需求管理

    详解敏捷过程中的需求管理

    企业在做敏捷转型中,需求无法按时交付的困扰你是否也遇到过呢?
    2021-05-05
  • 8个基于Lucene的开源搜索引擎(推荐)

    8个基于Lucene的开源搜索引擎(推荐)

    Lucene是一种功能强大且被广泛使用的搜索引擎,以下列出8种基于Lucene的搜索引擎,你可以想象他们有多么强大
    2017-04-04
  • nasm实现的用vmware运行自做的linux启动盘的引导代码

    nasm实现的用vmware运行自做的linux启动盘的引导代码

    这个小的代码的编写和运行还是能让自己对系统启动有一个更深的认识,不过有个不懂的就是怎么用ISO镜像文件启动,怎么将引导代码写入ISO镜像文件,依然没有找到很好的方法解决
    2013-04-04
  • 汇编语言 口算异或xor小结

    汇编语言 口算异或xor小结

    向 KernelKiller 致敬,只需要背会以下
    2012-07-07
  • Scala函数式编程专题--函数思想介绍

    Scala函数式编程专题--函数思想介绍

    这篇文章主要介绍了Scala函数式编程的的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • HBuilder打包App方法(图文教程)

    HBuilder打包App方法(图文教程)

    下面小编就为大家带来一篇HBuilder打包App方法(图文教程)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 10 款珍藏已久的 Chrome 浏览器插件(程序员必装)

    10 款珍藏已久的 Chrome 浏览器插件(程序员必装)

    Chrome 浏览器有一个好处,就是插件极其丰富,只有你想不到的,没有你找不到的,这恐怕是 Chrome 浏览器被众多爱好者钟爱的原因吧。今天给大家分享这些插件太强了,Chrome 必装!尤其程序员
    2021-03-03
  • 解读Serverless架构的前世今生

    解读Serverless架构的前世今生

    云计算的不断发展,涌现出很多改变传统IT架构和运维方式的新技术,而以虚拟机、容器、微服务为代表的技术更是在各个层面不断提升云服务的技术能力,它们将应用和环境中很多通用能力变成了一种服务。但无论这些技术应用在哪里,帮助企业降本增效是技术变革永恒的主题。
    2021-05-05
  • 怎样制作“别人家的”Chrome插件

    怎样制作“别人家的”Chrome插件

    Chrome插件有很多实用API可以让我们使用,通过Chrome插件我们还可以做很多的事情,例如翻译网页文字等。本文将教你怎样制作“别人家的”Chrome插件,感兴趣的小伙伴一起来看看吧
    2021-08-08

最新评论