纯函数(Pure Function)是这样一种函数——输入输出数据流全是显式(Explicit)的。
显式(Explicit)的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值;函数从函数外部接受的所有输入信息都通过参数传递到该函数内部;函数输出到函数外部的所有信息都通过返回值传递到该函数外部。
如果一个函数通过隐式(Implicit)方式,从外界获取数据,或者向外部输出数据,那么,该函数就不是纯函数,叫作非纯函数(Impure Function)。
隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如,读取全局变量,修改全局变量,都叫作以隐式的方式和外界进行数据交换;比如,利用I/O API(输入输出系统函数库)读取配置文件,或者输出到文件,打印到屏幕,都叫做隐式的方式和外界进行数据交换。
~~~
//一些例子
//纯函数
def add(a:Int,b:Int) = a + b
//非纯函数
var a = 1
def addA(b:Int) = a + b
def add(a:Int,b:Int) = {
println(s"a:$a b:$b")
a + b
}
def randInt() = Random.nextInt()
~~~
### 纯函数的好处(来自维基百科)
* 无状态,线程安全,不需要线程同步.
* 纯函数相互调用组装起来的函数,还是纯函数.
* 应用程序或者运行环境(Runtime)可以对纯函数的运算结果进行缓存,运算加快速度.
### 纯函数的好处(来自我的经验)
* 单元测试非常方便!
* 分布式/并发环境下,断点调试的方式无以为继,你需要单元测试.
单元测试什么的,赶紧去 [http://www.scalatest.org](http://www.scalatest.org/) 试试吧