引入
策略模式 VS 函数式编程
Java8中介绍Lambda表达式时,从硬编码到策略模式,再到内部类一步步优化而来。理论上来说,我们用Lambda表达式实现的功能,用策略模式、匿名函数也能实现,但为什么还要引入Lambda表达式呢?
我暂时理解到的包含以下几方面:
- 代码不易读,结构复杂;
- 每增加一种策略,都要新建一个实现类,不易维护;
- 如果有一万种情况呢,是否要新建一万个策略或匿名类呢?
而函数式编程可以很方便的解决以上问题,函数式编程的优点及应用情况:
- 易于重构、调试、测试
- 整体应用:数学计算、人工智能
- 局部应用:已遍地开花
概念
——使用函数进行编程,需要回到函数本身的概念上:
函数,在数学中,为两集合间的一种对应关系:输入值集合中的每项元素皆能对应唯一一项输出值集合中的元素。例如实数x对应到其平方x2的关系就是一个函数,若以3作为此函数的输入值,所得的输出值便是9。——维基百科
注意:
- 要将概念与表现形式区分
函数强调的是一种映射关系,具体实现可以有多种方式,对于函数的应用方来说,可以不用考虑其具体实现。 - 一个函数可以有不同的表现方式
平方关系的表现方式可以有:y=x2、多项式展开、泰勒展开等
特性
无副作用(纯函数):不会修改程序的状态
- 引用透明的
一等公民
- 作参数传递
- 作结果返回
- 存储于数据结构
高阶函数–可实现复杂参数的简单化处理
- 接收至少一个函数作为参数
- 返回结果是一个函数
应用
- 闭包:一种引用了外部作用域变量的特殊函数
js中的闭包示例
<script>
var global = "outer"
function outer(){
var global = "inner";
var a = 5
function inner(){
console.log(global)
console.log(a++)
}
return inner;
}
var r = outer();
r()
</script>
- 柯里化:模块化函数和重用代码的技术,将一个多参函数转化为一系列只接收一个参数函数的过程