概念:

简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。

它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。  ---《百度百科》

特点:

1. 函数是"第一等公民"

所谓"第一等公民"(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

这种设置在JavaScript中得到最完备的体现,在Java、Python等语言中则不具备这一点。

2. 只用"表达式",不用"语句"

"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

3. 没有"副作用"

所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。

4. 不修改状态

状态一般是通过变量来保存,不修改状态意味着不能修改输入值,而是每次返回输出值,通过输出保存状态。

5. 引用透明

引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。

6. 惰性计算

在惰性计算中,表达式不是在绑定到变量时立即计算,而是在求值程序需要产生表达式的值时进行计算。延迟的计算使您可以编写可能潜在地生成无穷输出的函数。因为不会计算多于程序的其余部分所需要的值,所以不需要担心由无穷计算所导致的 out-of-memory 错误。

在我的理解中,第2~4点是一致的,通过不修改状态、使用返回值,达到没有副作用的效果。

优点:

1. 代码简洁,开发快速

2. 接近自然语言,易于理解

3. 更方便的代码管理

4. 易于"并发编程"

理解:

关于Java1.8 lambda表达式及Stream中应用了函数式编程,但并不完全符合上述纯粹的函数式编程。

首先在Java中,函数是以接口(方法)的形式支持的,所以并不是第一等公民。

其次,函数并不是只用表达式,不用语句,有些函数是会修改输入变量,所以也并不是完全没有副作用。

另外,惰性计算在stream中得到充分的利用,stream的两类操作:转换操作和聚合操作,转换操作就是惰性计算,而聚合操作只能执行一次。

但stream的出现还是大大简化了集合的处理,将集合和数组以数学运算的方式进行增、删、改、查、聚合、统计、过滤等处理,处理过程更加接近自然数学运算,便于理解和管理。

函数式编程(一):概念及特点相关推荐

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

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

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

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

  3. 函数式编程学习之路(三)

    入门: 函数式编程之艰难,在于这玩意更接近数学,就是数学之"用",大牛们在云端,玩纯数学去了,弄出一堆公式及概念,码农们爬在地上,辛苦耕耘,要的是看得见摸得着的,函数式编程就是要打 ...

  4. 五分钟教会你函数式编程与闭包

    函数式编程这个概念我们可能或多或少都听说过,刚听说的时候不明觉厉,觉得这是一个非常黑科技的概念.但是实际上它的含义很朴实,但是延伸出来许多丰富的用法. 在早期编程语言还不是很多的时候,我们会将语言分成 ...

  5. 函数式编程语言python-Python——五分钟理解函数式编程与闭包

    今天是Python专题的第9篇文章,我们来聊聊Python的函数式编程与闭包. 函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听说的时候不明觉厉,觉得这是一个非常黑科技的概念.但是实际上它 ...

  6. 现代C++函数式编程

    作者简介: 祁宇,武汉烽火云创软件技术有限公司研发中心技术总监,<深入应用C++11>作者,C++开源社区purecpp.org创始人,致力于C++11的应用.研究和推广.乐于研究和分享技 ...

  7. 从JS对象开始,谈一谈“不可变数据”和函数式编程

    文章转载自:https://segmentfault.com/a/1190000008780076 作为前端开发者,你会感受到JS中对象(Object)这个概念的强大.我们说"JS中一切皆对 ...

  8. Python 函数式编程指北,不只是面向对象哦

    了解在Python中如何使用 lambda, map, filter 和 reduce 函数来转换数据结构 Photo by Markus Spiske on Unsplash 面向对象的编程通过封装 ...

  9. c++ 一个函数包括多个返回值判断_轻松玩转函数式编程

    最近和一些同学讨论了函数式编程,很多同学总觉得听起来很高大上,但用起来却无从下手.于是我抽时间捋了捋,将平时工作中用到的函数式编程案例和思想整理了出来,相信阅读本文后,大家都能快速上手函数式编程. 函 ...

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

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

最新文章

  1. MySQL:left join 避坑指南
  2. 利用Github+Jeklly搭建个人博客网站
  3. 【C】浅谈strcpy
  4. 【自动驾驶】26.【很清晰】旋转矩阵,欧拉角,四元数,旋转向量和齐次变换矩阵
  5. java剑姬_ListView和Adapter(文字列表)
  6. sql 不同数据库同步数据_什么是SQL数据同步
  7. HNU 实验五 小女孩与楼梯
  8. 爱创课堂每日一题第三十三天- 如何评价AngularJS和BackboneJS?
  9. 云上资源编排1.0到2.0的设计开发思考(含招聘)
  10. 【数据融合】基于matlab拓展卡尔曼滤波IMU和GPS数据融合【含Matlab源码 1600期】
  11. InnoSetup 如何获取安装程序的路径?
  12. 老闪创业那些事儿(88)——上市的钟声响起
  13. 如何能从自我怀疑中走出来?
  14. 站在知乎肩上-做更强的自己(3)
  15. 随机森林模型sklearn_sklearn中的随机森林
  16. 做数据分析的36款常用工具!!!初学者必备,纯干货!!
  17. 使用sqlyog连接阿里云rds数据库
  18. 使用uPnP在路由器上映射端口
  19. mimo-ofdm无线通信技术及matlab实现_华为技术岗直招,17岗可选!
  20. 2020年Java前景如何?现在还适合入行吗?

热门文章

  1. WebService:一些常用的webservice网址
  2. SQLzoo练习题回顾
  3. ffmpeg 解码视频小例子
  4. CANBridge 系列本安型智能 CAN 总线隔离中继器
  5. 文字识别(六)--不定长文字识别CRNN算法详解
  6. 气动阀门定位器工作原理
  7. 通过ScheduledExecutorService代替Timer
  8. htmlcss全屏视频背景
  9. 如何评估工时和开发计划
  10. 使用阿里云的负载均衡服务器配置流程和配置数据库读写分离配置(全)