本文較為詳細地介紹了Scala的理論,並結合相應的代碼進行解讀與實踐。文章內容主要包含Scala的簡介,數據類型,函數(函數定義、匿名函數、嵌套函數、迴圈語句等),集合(List、Tuple、Map),伴生對象,trait,Actor,隱式轉換,JDBC等。 ...
目 錄
一、Scala概述
二、Scala數據類型
三、Scala函數
四、Scala集合
五、Scala伴生對象
六、Scala trait
七、Actor
八、隱式轉換與隱式參數
九、Scala JDBC
由於整理的篇幅較長,所以文章計劃分三次發佈。
一、Scala概述
1. Scala簡介
Scala是一種針對JVM將函數和麵向對象技術組合在一起的編程語言。所以Scala必須要有JVM才能運行,和Python一樣,Scala也是可以面向對象和麵向函數的。Scala編程語言近來抓住了很多開發者的眼球。它看起來像是一種純粹的面向對象編程語言,而又無縫地結合了命令式和函數式的編程風格。Scala的名稱表明,它還是一種高度可伸縮的語言。Scala的設計始終貫穿著一個理念:創造一種更好地支持組件的語言。Scala融匯了許多前所未有的特性,而同時又運行於JVM之上。隨著開發者對Scala的興趣日增,以及越來越多的工具支持,無疑Scala語言將成為你手上一件必不可少的工具。Spark最最源生支持的語言是Scala。Spark主要支持java、Scala、Python和R。Scala的底層協議是akka(非同步消息傳遞)。
2. Scala安裝與開發工具
Scala版本使用Scala-2.10.x。
JDK使用jdk-1.8。
開發工具使用Intellij IDEA-2017.3.5。
二、Scala數據類型
1. 數據類型
scala擁有和java一樣的數據類型,和java的數據類型的記憶體佈局完全一致,精度也完全一致。其中比較特殊的類型有Unit,表示沒有返回值;Nothing表示沒有值,是所有類型的子類型,創建一個類就一定有一個子類是Nothing;Any是所有類型的超類;AnyRef是所有引用類型的超類;註意最大的類是Object。
上表中列出的數據類型都是對象,也就是說scala沒有java中的原生類型。在scala是可以對數字等基礎類型調用方法的。例如數字1可以調方法,使用1.方法名。
如上兩圖所示,可見所有類型的基類與Any。Any之後分為兩個AnyVal與AnyRef。其中AnyVal是所有數值類型的父類型,AnyRef是所有引用類型的父類型。
與其他語言稍微有點不同的是,Scala還定義了底類型。其中Null類型是所有引用類型的底類型,及所有AnyRef的類型的空值都是Null;而Nothing是所有類型的底類型,對應Any類型;Null與Nothing都表示空。
在基礎類型中只有String是繼承自AnyRef的,與Java,Scala中的String也是記憶體不可變對象,這就意味著,所有的字元串操作都會產生新的字元串。其他的基礎類型如Int等都是Scala包裝的類型,例如Int類型對應的是Scala.Int只是Scala包會被每個源文件自動引用。
標準類庫中的Option類型用樣例類來表示拿著可能存在、也可能不存在的值。樣例子類Some包裝了某個值,例如:Some(“Fred”);而樣例對象None表示沒有值;這比使用空字元串的意圖更加清晰,比使用null來表示缺少某值的做法更加安全(避免了空指針異常)。
2. 聲明與定義
欄位/變數的定義Scala中使用var/val 變數/不變數名稱: 類型的方式進行定義,例如
var index1 : Int= 1
val index2 : Int= 1
在Scala中聲明變數也可以不聲明變數的類型。
- 常量的聲明 val
使用val來聲明一個常量。與java一樣,常量一次賦值不可修改。
val name : String="Yang"//這是完整的寫法,可以省略類型,如下所示: val name="Yang"
name="Yang2"//會報錯reassignment to val
- 變數的聲明 var
var name : String = "Yang" //這是完整的寫法,可以省略類型,如下所示: //var name = "Yang" //變數或常量聲明時,類型可以省略,Scala內部機制會推斷。 name = "Yang2"//變數的值可以修改
- 函數的聲明 def
使用def關鍵字來聲明函數。例如:
object HelloScala { def main(args: Array[String]): Unit = { println(f) } val a=1 var b=2 def f=a*b }