为什么我们需要学习函数式编程?或者说函数式编程有什么优势?这个系列中我会用 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 年前就有了,但为什么直到被发明出来才为人们所知?

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

往小了说,当我们在学习新的技术,或是使用新技术完成某项工作的时候,我们一定要直到它的边界在哪里。

往大了说,我们应该像苹果一样,多多思考这个时代的技术边界在哪里,这样才不至于陷入无休止的技术追赶之中。

以上~~

推荐阅读:

缓存世界中的三大问题及解决方案

『代码之外』用经济学利息的角度看美债倒挂

计算机之父,你知道是谁吗?


Scala 函数式编程(一) 什么是函数式编程?相关推荐

  1. Scala函数式编程设计原理 第一课 编程范式(Programming Paradigms)

    我使用Scala有一两年的时间了,这门语言仿佛有一种魔力,让人用过就不想放手.Scala给我的整个程序生涯带来了非常深刻的影响,让我学会了函数式编程,让我知道了世界上居然还有这么一种优雅.高效.强大的 ...

  2. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 ...

  3. 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)

    编程范式: 命令式编程/声明式编程 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数) 高阶函数 filter/map/reduce filter中的回调函数有一个要求: 必须返 ...

  4. java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...

  5. python函数的作用降低编程复杂度_Python函数式编程

    lambda 本文将介绍Python中函数式编程的特性.在对函数式编程的概念有了了解后,本文会介绍iterators和generators等语言特性,还有itertools和functools等相关的 ...

  6. WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer

    函数式编程:告诉他的功能是什么,而不是告诉他怎么做 命令式编程:怎么去做 函数式编程:不需要关注细节,利用系统已经有的API 使用jdk8自带函数接口的好处 函数接口减少接口定义 函数式接口链式操作 ...

  7. Java中的函数式编程(二)函数式接口Functional Interface

    写在前面 前面说过,判断一门语言是否支持函数式编程,一个重要的判断标准就是:它是否将函数看做是"第一等公民(first-class citizens)". 函数是"第一等 ...

  8. 函数式编程|python的函数式编程

    面向过程,面向对象 面向过程: 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 面向对象: 把问题中的事务分解成各个对象,建立对象的目的不是为了完成一 ...

  9. 《.NET并发编程实战》之 函数式并发基础

    本书是一本划时代的著作!在以下领域具有非常深远的意义: .NET 开发领域--本书再次将.NET 开发人员进行了分层隔代. 高性能/多核/并发编程领域--本书让锁从此变成过去时. 程序员职业生涯领域- ...

  10. SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理

    SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...

最新文章

  1. python日期函数引用_Python pandas.to_datetime函数方法的使用
  2. 输出两个整数中最大的书c语言,c语言程序设计实验指中导书-2.doc
  3. python场景异常_python-异常
  4. hdu 1418(不相交的曲线分面)
  5. 【语义分割】CVPR2021_Rethinking BiSeNet For Real-time Semantic Segmentation
  6. 一篇论文未发博士毕业,中科院最年轻院士入职浙大
  7. php 如何模拟浏览器,利用php的curl扩展进行模拟浏览器访问网页
  8. 安装oracle12c之前,centos7安装oracle12c数据库的坑
  9. python print table_python 6.7 编写printTable()函数表格打印(完整代码)
  10. linux获取系统启动时间
  11. Oracle开发:常用的数据库字段类型[转]
  12. 用lm()拟合回归模型
  13. date比较大小 mybatis_面试官:给我说说你使用Mybatis的过程中遇到过哪些坑?
  14. java图书管理系统(MySQL)
  15. 微信小程序商城项目实战(第三篇:商品列表)
  16. 北京航空航天计算机考研科目,2020考研北京航空航天大学计算机考研考试科目...
  17. 用php求两数之和,Leetcode PHP 两数之和
  18. php账号登录验证手机号码,最完整的php验证手机号码
  19. php获取蓝凑云文件列表,蓝奏云网盘登录获取文件例程
  20. 微生物组-宏基因组分析(线上/线下同时开课,2021.11)

热门文章

  1. PTA 7-128 大于m的最小素数
  2. 给Ubuntu配置静态IP地址
  3. LabVIEW编程LabVIEW控制GPS例程与相关资料
  4. 在word中强制换行方法如下
  5. 华为全球发布UMTS终端商用新品
  6. 你靠谱吗?看看“价值观”究竟有多重要
  7. Dolby与DTS杜比环绕与DTS环绕音响
  8. 颜色代码表#FFFFFF #FF0000 #00FF00 #FF00FF (2015-07-21 10:39)转载
  9. 结构方程模型amos中介效应与调节效应
  10. Markdown中在线编辑公式LaTex