在函數式語言中,函數作為一等公民,可以在任何地方定義,在函數內或函數外,可以作為函數的參數和返回值,可以對函數進行組合。由於命令式編程語言也可以通過類似函數指針的方式來實現高階函數,函數式的最主要的好處主要是不可變性帶來的。沒有可變的狀態,函數就是引用透明(Referential transparency)的和沒有副作用(No Side Effect)。
任何一種函數式語言中,都有map函數與faltMap這兩個函數,比如Python雖然不是純函數式語言,也有這兩個函數。再比如在jdk1.8之后,也加入了Lambda表達式,自然也支持map函數。
現在簡單說說Scala中這兩個函數的用法。有一種觀點認為將map和flatMap說成scala函數機制的核心都不為過分,其實是有一定道理的。因為實際中我們使用最多的場景就是對數據進行map操作或者flatMap操作。map函數的用法,顧名思義,將一個函數傳入map中,然后利用傳入的這個函數,將集合中的每個元素處理,並將處理后的結果返回。而flatMap與map唯一不一樣的地方就是傳入的函數在處理完后返回值必須是List,其實這也不難理解,既然是flatMap,那除了map以外必然還有flat的操作,所以需要返回值是List才能執行flat這一步。
廢話不多說,看一個小例子就明白用法了。
object collection_t1 { def flatMap1(): Unit = { val li = List(1,2,3) val res = li.flatMap(x => x match { case 3 => List('a','b') case _ => List(x*2) }) println(res) } def map1(): Unit = { val li = List(1,2,3) val res = li.map(x => x match { case 3 => List('a','b') case _ => x*2 }) println(res) } def main(args: Array[String]): Unit = { flatMap1() map1() } }
最后輸出為:
List(2, 4, a, b)
List(2, 4, List(a, b))