一、將函數賦值給變量java
二、匿名函數閉包
五、Scala的經常使用高級函數函數
六、閉包spa
七、SAM轉換3d
八、Currying函數對象
九、returnblog
Scala的函數是一等公民,能夠獨立定義,獨立存在,並且能夠直接將函數做爲值賦值給變量。排序
Scala語法規定,將函數賦值給變量時,必須在函數後面加上空格和下劃線。接口
Scala中,函數能夠不須要命名,此時函數被稱爲匿名函數。作用域
能夠直接定義函數後,將函數賦值給某個變量,也能夠將直接定義的匿名函數傳入其餘函數之中。
Scala匿名函數的語法規則是 (參數名:參數類型)=>函數體
Scala中,能夠直接將某個函數傳入其餘函數,做爲參數。這個功能很是強大,java不具有這樣的特性。接收其餘函數做爲參數的函數,也被稱爲高階函數(higher-order function)。
高階函數的另一個功能是將函數做爲返回值。
高階函數能夠自動推斷出參數類型,不須要寫明類型;並且對於只有一個參數的函數,還能夠省去其小括號。若是僅有的一個參數在右側的函數體內只使用一次,則還能夠省略接受參數,而且將參數用_來替代。
map:對傳入的每一個元素進行映射,返回一個處理後的元素
foreach:對傳入的每一個元素都進行處理,可是沒有返回值
filter:對傳入的每一個元素都進行條件判斷,若是對元素返回true,則保留該元素,不然過濾掉該元素。
reduceLeft:從左側元素開始,進行reduce操做,即先對元素1和2進行處理,而後將結果和元素3 處理,再將結果與元素4處理,依次類推,即爲reduce。
sortWith:對元素進行兩兩相比,進行排序
閉包最簡潔的解釋:函數在變量不處於其有效做用域時,還可以對變量進行訪問,即爲閉包。
兩次調用getGreetingFunc函數,傳入不一樣的msg,並建立不一樣的函數返回。
然而,msg只是一個局部變量,卻在getGreetingFunc執行完以後,還能夠繼續存在建立的函數中,greetingFuncHello(「LiLei」)調用時,值爲hello的msg被保留在了函數體內部,能夠反覆的使用。這種變量超出了其做用域,還可使用的狀況,即爲閉包。
Scala經過爲每一個函數建立對象來實現閉包,實際上對於getGreetingFunc函數建立的函數,msg做爲函數對象的變量存在的,所以每一個函數才能夠擁有不一樣的msg。
Java中,不支持直接將函數傳入一個方法做爲參數,一般來講,惟一的辦法就是定義一個實現了某個接口的類的實例對象,該對象只有一個方法;而這些接口都只有單個的抽象方法,也就是single abstract method,簡稱SAM。
因爲Scala能夠調用Java代碼的,所以當咱們調用java的某個方法時,就不得不建立SAM傳遞給方法,很是麻煩;可是Scala又是支持直接傳遞函數的。此時就可使用Scala提供的,在調用java方法時,使用的功能,SAM轉換,即將SAM轉換爲Scala函數。
要使用SAM轉換,須要使用Scala提供的特性,隱式轉換。
Curring函數,是指將原來接受兩個參數的一個函數,轉換爲兩個函數,第一個函數接受原來的第一個參數,而後返回接受原來第二個參數的第二個函數。
Scala中,不須要使用return來返回函數的值,函數最後一行語句的值就是函數的返回值。
return用於在匿名函數中返回值給包含匿名函數的帶名函數,並做爲帶名函數的返回值。
使用return的匿名函數,是必須給出返回類型的,不然沒法經過編譯。