响应式编程和函数式编程
一、响应式编程(Reactive Programming,RP)
1、关键字
RxJava,观察者模式,EventBus,广播,Gateway
2、定义
响应式编程是一种面向数据流和变化传播的编程范式
。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
例如,对于 a=b+c 这个表达式的处理,在命令式编程
中,会先计算 b+c 的结果,再把此结果赋值给变量a,因此b,c两值的变化不会对变量a产生影响
。但在响应式编程中,变量a 的值会随时跟随 b,c 的变化而变化
。
电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。
响应式编程最初是为了简化交互式用户界面的创建和实时系统动画的绘制而提出来的一种方法,但它本质上是一种通用的编程范式。
例如,在MVC软件架构中,响应式编程允许将相关模型的变化自动反映到视图上,反之亦然。
3、特点
(1)异步编程
提供了合适的异步编程模型,能够挖掘多核CPU的能力、提高效率、降低延迟和阻塞等。
(2)数据流
基于数据流模型,响应式编程提供一套统一的Stream风格的数据处理接口。和Java 8中的Stream相比,响应式编程除了支持静态数据流,还支持动态数据流,并且允许复用和同时接入多个订阅者。
(3)变化传播
简单来说就是以一个数据流为输入,经过一连串操作转化为另一个数据流,然后分发给各个订阅者的过程。这就有点像函数式编程中的组合函数,将多个函数串联起来,把一组输入数据转化为格式迥异的输出数据。
二、函数式编程(Functional Programming,FP)
1、关键字
lambda,lisp,大数据,AI
2、定义
函数式编程是种编程方式,它将电脑运算视为函数的计算
。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。
和过程化编程相比,函数式编程里函数的计算可随时调用。
3、特点
(1)闭包和高阶函数
函数编程支持函数作为第一类对象,有时称为闭包或者仿函数(functor)对象。实质上,闭包是起函数的作用并可以像对象一样操作的对象。与此类似,FP 语言支持高阶函数。高阶函数可以用另一个函数(间接地,用一个表达式) 作为其输入参数,在某些情况下,它甚至返回一个函数作为其输出参数。这两种结构结合在一起使得可以用优雅的方式进行模块化编程,这是使用 FP 的最大好处。
(2)惰性计算
除了高阶函数和仿函数(或闭包)的概念,FP 还引入了惰性计算的概念。在惰性计算中,表达式不是在绑定到变量时立即计算,而是在求值程序需要产生表达式的值时进行计算。延迟的计算使您可以编写可能潜在地生成无穷输出的函数。因为不会计算多于程序的其余部分所需要的值,所以不需要担心由无穷计算所导致的 out-of-memory 错误。一个惰性计算的例子是生成无穷 Fibonacci 列表的函数,但是对第n个Fibonacci 数的计算相当于只是从可能的无穷列表中提取一项。
(3)递归
FP 还有一个特点是用递归做为控制流程的机制。例如,Lisp 处理的列表定义为在头元素后面有子列表,这种表示法使得它自己自然地对更小的子列表不断递归。
函数式编程具有五个鲜明的特点。
(4)函数是"第一等公民"
所谓"第一等公民"(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。
var print = function(i){ console.log(i);};
[1,2,3].forEach(print);
(5)只用"表达式",不用"语句"
“表达式”(expression)是一个单纯的运算过程,总是有返回值;“语句”(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
原因是函数式编程的开发动机,一开始就是为了处理运算(computation),不考虑系统的读写(I/O)。"语句"属于对系统的读写操作,所以就被排斥在外。
当然,实际应用中,不做I/O是不可能的。因此,编程过程中,函数式编程只要求把I/O限制到最小,不要有不必要的读写行为,保持计算过程的单纯性。
(6)没有"副作用"
所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
(7)不修改状态
上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。
在其他类型的语言中,变量往往用来保存"状态"(state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。下面的代码是一个将字符串逆序排列的函数,它演示了不同的参数如何决定了运算所处的"状态"。
(8)引用透明性
函数程序通常还加强引用透明性,即如果提供同样的输入,那么函数总是返回同样的结果。就是说,表达式的值不依赖于可以改变值的全局状态。这使您可以从形式上推断程序行为,因为表达式的意义只取决于其子表达式而不是计算顺序或者其他表达式的副作用。这有助于验证正确性、简化算法,甚至有助于找出优化它的方法。
(9)副作用
副作用是修改系统状态的语言结构。因为 FP 语言不包含任何赋值语句,变量值一旦被指派就永远不会改变。而且,调用函数只会计算出结果 ── 不会出现其他效果。因此,FP 语言没有副作用。
3、缺点
函数式编程常被认为严重耗费在CPU和存储器资源。主因有二:
(1)早期的函数式编程语言实现时并无考虑过效率问题。
(2)有些非函数式编程语言为求提升速度,不提供自动边界检查或自动垃圾回收等功能。
惰性求值亦为语言如Haskell增加了额外的管理工作。
参考文献:
《响应式编程 函数式编程 简介》
《响应式编程》
《函数式编程》
https://cloud.tencent.com/developer/article/1039127
响应式编程和函数式编程相关推荐
- 链式编程和函数式编程
说起链式编程和函数式编程,小伙伴们千万不要紧张. 听着很高大尚,其实也就那么回事.相信有过C#开发经验的,或者其他编程经验的,只要不是OC,一看就知道. 看两行代码: 1 Person *person ...
- java 函数式编程_函数式编程杂谈
比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算.本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处. 一 ...
- 几段小代码解释Python命令式编程和函数式编程
所谓命令式编程,是指How to do,要通过指令告诉计算机如何一步一步地完成预定任务:而所谓函数式编程,可理解为What to do,只需要通过简单的指令告诉计算机要做什么就可以了,代码更加简洁.易 ...
- 命令式编程与函数式编程
命令式编程 命令式编程(英语:Imperative programming),是一种描述电脑所需作出的行为的编程典范.几乎所有电脑的硬件工作都是指令式的:几乎所有电脑的硬件都是设计来运行机器码,使用指 ...
- java什么是函数式编程,Java 函数式编程(一)初识篇
本文已授权"后端技术精选"独家发布. 开发者使用Java8编写复杂的集合处理算法,只需要简单的代码就能在多喝cpu上高效运行,这就是Lambda表达式的初衷. 提示:函数式编程和语 ...
- 函数式编程,函数式编程信奉那棵动态的运动树
cpu是树的动力源. 面向结构编程,面向结构编程所信奉的是努力设计那棵静态的资源树,相信那棵静态的资源树的良好可以大大降低那棵动态的运动树的复杂度.因为系统的资源树已经被提前进行了良好的设计,从而可以 ...
- 响应式编程 函数式编程_函数式编程的基本原理简介
响应式编程 函数式编程 After a long time learning and working with object-oriented programming, I took a step b ...
- 响应式编程 函数式编程_函数式编程简介
响应式编程 函数式编程 根据您要求的对象, 函数式编程 (FP)是一种应运而生的开明编程方法,或者是一种在实践中几乎没有实际好处的过于学术化的方法. 在本文中,我将解释什么是函数式编程,探讨其好处,并 ...
- java函数式编程_Java 函数式编程和 lambda 表达式详解
作者:DemonsI my.oschina.net/demons99/blog/2223079 为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要 ...
最新文章
- Gradle of Android Example
- P3197 [HNOI2008]越狱(快速幂)
- 九毛九集团java_JAVA数组课后作业
- SQL Server-已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行...
- 【小家Java】Future与FutureTask的区别与联系
- Collection与Arrays
- 苹果无法安装计算机,苹果电脑安装win7报错误,代码状态0xc0000428,信息:windows无法验证此文件的数字签名,applessd.sys...
- extremecomponents-1.0.1.jar 的使用小例子
- linux服务器共享网络设置方法,Windows和linux网络共享 配置网上邻居
- 状态方程和特性方程的区别
- 不要迷恋哥,哥只是个传说 - 生活至上,美容至尚!
- SpringBoot从入门到精通教程(三十)- 支付宝企业支付集成(五分钟集成)
- ESP32开发路程蓝牙篇——BLE(GATT),修改设备名称,添加characteristic,发送数据,接收数据
- 搭建一套基于 Groovy 规则引擎的业务风控平台
- 如何禁用笔记本电脑触摸板_您如何永久禁用笔记本电脑上的触摸板?
- Python版股市情感分析源代码,提取投资者情绪,为决策提供参考
- Git add 、commit后报错:nothing to commit, working tree clean
- Eclipse中设置作者日期等Java注释模板
- Windows常用的快捷键 让妹子办公效率速提升
- 【产品升级】愚人节不愚人,效率源手机取证产品SPF9139升级来袭!
热门文章
- 如何使img或者div在div中水平垂直居中显示
- android U盘 io异常,U盘出现I/O错误的详细解决对策
- shopex商城的部署和安装
- C语言中的 gets,puts,getchar,putchar函数解析
- linux 监听图形,Zabbix3.2+Grafana4.0实现可视化监控图形
- 中小企业如何选择仓库管理软件?看这一篇就够了
- mac系统时间自动校准仍然不准确修复方式
- 使用Unity模拟人群疏散的资料整理
- 华为云桌面客户端_华为云CloudIDE的前世今生
- 【极简版GH60】【GH60剖析】【二】原理图的分析