純函數(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/)?試試吧