1. 程式人生 > >Scala快速學習教程(一)

Scala快速學習教程(一)

    在學習spark時使用到了scala語言進行程式設計,特編寫此部落格,已儘量精簡的方式對scala語言進行總結學習(在至少會一門程式語言的基礎上看此篇部落格會比較容易)。Scala運行於Java平臺(JVM,Java 虛擬機器)上,併兼容現有的Java程式,Scala程式碼可以呼叫Java方法,訪問Java欄位,繼承Java類和實現Java介面。scala與java有許多相似之處,建議進行對比學習。本文編寫預設讀者已安裝好scala程式設計環境,若未安裝可訪問scala安裝。本文參考子雨大資料之spark入門教程精簡整理而成,可訪問該網址獲得更多內容。

基本資料型別及變數的宣告和操作符

Scala的資料型別包括:Byte、Char、Short、Int、Long、Float、Double和Boolean。對於字串,Scala用java.lang.String類來表示字串。

Scala有兩種型別的變數,一種是val,是不可變的,在宣告時就必須被初始化,而且初始化以後就不能再賦值;另一種是var,是可變的,宣告的時候需要進行初始化,初始化以後還可以再次對其賦值。

scala> val a = 5
a: Int = 5

需要注意的是,儘管我們在第1行程式碼的宣告中,沒有給出變數型別,但是,Scala具有“型別推斷”能力,可以自動推斷出變數的型別。如對於整數自動腿短為Int,浮點數自動推斷為Double,讀者可自行編寫程式碼進行實驗。若想將整數指定為Short型別,可進行顯示宣告。

scala> val b : Short = 5
b: Short = 5

對val變數再次賦值會報錯,如果一些變數,需要在初始化以後還要不斷修改它的值,則需要宣告為var變數。

Scala支援加(+)、減(-) 、乘(*) 、除(/) 、餘數(%)等算數運算操作符和大於(>)、小於(<)、大於等於(>=)和小於等於(<=)的邏輯運算操作符。

注意:與java不同,Scala中未提供++和--,只能使用+=1或-=1來遞增或遞減

scala> var i = 5;
i: Int = 5
scala> i += 1  //將i遞增
scala> println(i)
6

Range

在執行for迴圈時經常需要指定迴圈範圍,在Scala中採用Range實現,建立Range時需要給出區間的起點和終點以及步長(預設步長為1)。

scala> 1 to 10  //包含區間終點
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> 1 until 10  //不包含區間終點
res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> 1 to 10 by 2  //指定步長為2
res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)

scala> 'a' to 'c'
res3: collection.immutable.NumericRange.Inclusive[Char] = NumericRange(a, b, c)

另外可以使用Range建立列表,陣列和集合等。

scala> val x = (1 to 10).toList
x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> val x = (1 to 10).toArray
x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> val x = (1 to 10).toSet
x: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

下面給出一個for迴圈使用Range的簡單例子,在控制結構處再詳細講解for迴圈

scala> for (i <- 1 to 3) println(i)
1
2
3

輸出語句

print()不換行,println()換行

此外還帶有C語言風格的格式化字串的printf函式

printf("My name is %s. I hava %d apples and %d eggs.\n","Ziyu",2,3)

 控制結構

if語句與java相同,有一點不同的是,Scala中的if表示式的值可以賦值給變數

val a = if (x>0) 1 else -1

與java相同的while,do-while

在上面講解Range時給出了一個for迴圈的小例子。在java中通常使用for( ; ; )來表達迴圈條件例如:

for(int i=1;i<=5;i+=2) System.out.println(i);

等價於Scala中

for(i <- 1 to 5 by 2) println(i)

當希望過濾出滿足條件的結果時,可使用守衛表示式,在後面新增if開頭的Boolean表示式

for (i <- 1 to 5 if i%2==0) println(i)

Scala支援多個生成器情形,用分號隔開,相當於兩個for迴圈巢狀,每個生成器可帶一個守衛表示式,如

for (i <- 1 to 5 if i%2==0; j <- 1 to 3 if j!=i) println(i*j)

for推導式:使用yield關鍵字對過濾結果構建集合,用於後續其他處理。函數語言程式設計思想,關心資料對映,一種東西和另一種東西之間的對應關係。

scala> for (i <- 1 to 5 if i%2==0) yield i
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)