文章目錄
Scala是一門怎樣的語言,具有哪些優點?
- 快速實驗
- 快速嘗試各種語法和代碼
- 一致性
- 靜態類型系統+面向對象+函數式編程
- 面向對象
- 所有的變量和方法都封裝在對象中
- 函數式編程
- 函數可以獨立存在,可以定義一個函數作爲另外一個函數的返回值,也可以接受函數作爲函數的參數
- 異步編程
- 函數式編程提倡變量不可變,使得異步編程變得十分容易
- 基於JVM
- Scala會被編譯成爲Bytecode,所以Scala能無縫集成已有的Java類庫
- Scala會被編譯成爲Bytecode,所以Scala能無縫集成已有的Java類庫
Scala語法基礎-從Hello World說起
Scala值和變量聲明
- val變量和var變量
- val聲明的變量不可變,相當於java中的final
- val a = 1
- a = 2 // 出錯啦
- var聲明的變量可變
- var a = 1
- a = 2 // OK
- val聲明的變量不可變,相當於java中的final
- 在scala的類中,val會自動帶有getter方法,var會自動帶有getter和setter方法
Scala常用類型
- Scala沒有區分基本類型和包裝類型,統一定義爲class類。
- 1.toString() // 生成字符串1
- 7種數值類型+1種Boolean類型
- Byte -> RichByte
- Char -> RichChar
- Short -> RichShort
- Int -> RichInt
- Long -> RichLong
- Float -> RichFloat
- Double -> RichDouble
- 在基本數據類型上使用那些沒有提供的方法時,scala會嘗試“隱式轉換”轉換成增強類型
- Example
- 1.to(10) // 生成出Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
- Example
方法的定義和使用
• 方法定義
• 格式
def 方法名(參數名: 參數類型): 返回值類型 = {
return xxx // return可省略
}
• 當返回值爲unit時
def 方法名(參數名: 參數類型) {
// 方法體
}
• 無參數函數定義
def 方法名 {
// 方法體
}
• Example
def m1(a: Int, b: Int): Int = {
a + b
}
def m2() = 100
def m3 = 100
函數的定義和使用
- 函數定義
- 函數在scala中是一等公民
- val 函數名:(參數類型1, … , 參數類型n)=>返回值類型 = (T1,…, Tn) => 函數體
- val 函數名 = (參數名1: 參數類型1, … , 參數名n: 參數類型n) =>函數體
- 函數必須有參數列表,否則報錯
• val f1 = => 100 // 錯誤
• val f2 = () => 100 // 正確
函數與方法區別
- 方法不可以賦值給變量但是函數可以
- 對於一個無參數的方法是沒有參數列表的,而對於函數是有一個空參數列表。
- 函數名後必須加括號才代表函數調用,否則爲該函數本身,而方法名後不加括號爲方法調用
Example - 方法計時器
循環和高級for循環
常見集合使用
- C 操作時間爲常數
- eC 操作時間在滿足某些假設的前提下爲常數
- aC該操作的均攤運行時間爲常數。某些調用的可能耗時較長,但多次調用之下,每次調用的平均耗時是常數。
- L 操作是線性的,耗時與容器的大小成正比。
異常處理
- 如果在.map, .flatMap中遇到異常如何處理?
- Scala提供了scala.util.Try 類型更加優雅的處理異常
- 如果成功返回Success
- 如果拋出異常返回Failure並攜帶異常信息
類定義
類構造函數
類繼承
- Scala繼承類和java一樣使用extends關鍵字
- 可以將類、字段或者方法聲明爲final,確保它們不能被重寫
- 重寫一個非抽象方法必須使用override關鍵詞
- 可以將類定義爲abstract作爲抽象類,子類中重寫超類的抽象方法時不
需要使用override關鍵詞 - 調用超類與Java一致使用super關鍵詞
- 只有主構造器才能調用超類的構造器
單例對象
函數式編程思想
- 函數式編程關心的是數據的映射而命令式編程關心的是解決問題的步驟
- 函數式編程提倡
- 沒有可變的變量
- 例如無論sqrt(x),這個函數的值只取決於函數的輸入的值
- 沒有類似於命令式編程中循環元素
- 沒有可變的變量
- 好處
- 不依賴於外部的狀態,也不修改外部的狀態,使得代碼容易推理,
單元測試和調試變得十分容易 - 由於多個線程之前不共享狀態,因此不會造成資源的競爭,可以更
好的支持併發
- 不依賴於外部的狀態,也不修改外部的狀態,使得代碼容易推理,