1 函數式編程思想
- 純函數,沒有副作用
即沒有諸如修改全局變量、拋出異常、IO讀寫和調用有副作用的函數等狀態變化 - 參數和函數體都是引用透明
即對於相同的輸入,總是得到相同的輸出。反例:append函數。
爲了獲得引用透明性,任何值都不能變化。 - 函數是一等公民
Scala中函數就像普通變量一樣,同樣也具有函數的類型。
- 高階函數:用函數作爲形參或返回值的函數
- 閉包
2 語言基礎
2.1 變量
val、 var、 lazy val
注:當定義的變量可能後續不會用到時可使用lazy val
2.2 數據類型
- Unit:表示空,
val x:Unit=()
,val x=()
- Null:scala中通常不會使用null而是使用option
- Nothing:表示程序異常中止,若一個函數返回nothing表明該函數發生異常
- String:支持字符串插值,用${name}可在字符串裏引入name這個變量代表的字符串
2.3 函數與代碼塊
2.3.1 代碼塊
代碼塊Block是表達式,最終的值是最後一個表達式的值,Block有兩種表達方式:
- {exp1;exp2}
- {
exp1
exp2
}
2.3.2 函數
- 只有一個表達式的時候可以去掉花括號
- 有些簡單的表達式scala會自動推斷出返回類型
2.4 if與for
2.4.1 if
if (lofical_exp) valA
if (lofical_exp) valA else valB
·
2.4.2 for
是實現循環的推導式,本質是scala的函數向Map、Reduce組合而實現的,是scala的語法糖的一種。
2.5 try與match表達式
2.5.1 try
try是表達式,會返回一個值
2.5.2 match
類似c++的switch
3 求值策略
scala中所有運算都是基於表達式。默認是call by value,函數調用前會對實參中所有的表達式進行求值。
舉個栗子:
4 高階函數
4.1 函數與匿名函數
- 函數類型:A=>B,表示一個接受類型A的參數,並返回類型B的函數
- 高階函數:用函數作爲形參或返回值的函數
- 匿名函數:函數常量,格式爲:{形參列表}=>{函數體}
例:(x:Int, y:Int) => x + y
4.2 柯里化
把具有多個參數的函數轉換爲一條函數鏈,每個節點是單一參數
4.3 遞歸與尾遞歸
在函數式編程中,所有的循環都是通過遞歸實現。
遞歸層數多,容易造成堆棧溢出。爲了解決這個問題,於是出現了尾遞歸。
舉個栗子:
5 Collections-list基本使用
5.1 List[T]
val a=List(1,2,3,4)
val b=0::a
val c="x"::"y"::Nil
val d=a:::c
a.head //返回當前List的第一個元素
a.tail //返回當前List除了第一個元素外剩下元素組成的列表
a.isEmpty
Nil,Empty
List的高階函數
- 參數都是匿名函數
- takeWhile遍歷到False時就停止了
- 區分map與flatMap
6 集合的歸約操作
6.1 reduceLeft
6.2 foldLeft 更通用
6.3 Rang與Stream
6.4 tuple與map
舉個栗子:實現快速排序,每次取元素爲a.head,把小於a.head放在前面,大於的放在後面。