纯函数(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/) 试试吧