【《快學Scala》筆記】
一、基礎
1、變量
val 標志符: 聲明常量; 如,val answer = 1
var 標志符:聲明變量;
- 類型推斷:變量的類型由scala根據初始化變量的表達式推斷而來;
鼓勵使用val;
注:聲明變量時不做初始化會報錯。
- 明確類型: scala的變量或函數的類型總是寫在變量或函數的后面。
1 val a:Int = 1 2 val str:String = 2
2、常用類型
Scala支持7種數值類型和1種Boolean類型。
- Byte/Char/Short/Int/Long/Float/Double
- Boolean
注:所有這些類型都是類,Scala並未區分基本類型與引用類型。如,可以調用1.toString方法。
3、數值類型轉換:
Scala中使用方法,而非強制類型轉換來做數值類型之間的轉換。如,

4、操作符
Scala支持Java中絕大多數操作符,不過所有的操作符都是方法。如:
a+b 是 a.+(b) 的縮寫
即:a 方法 b 是 a.方法(b) 的縮寫,兩種寫法可以互換。
【注:Scala不支持 ++ 和 -- 操作符。】
5、函數調用和方法
常用數學函數包括在scala.math包中,可以通過如下語句引入包。
1 import scala.math._ // Scala中,字符 _ 是通配符,類似Java中的*
另外,以scala開頭的包,在引入或使用時可以省略scala。
1 import math._ 2 3 math.sqrt(2)
【注:Scala中沒有靜態方法。】
不帶參數的方法在調用時可以省略括號,如:
1 "hello World".toString
6、apply方法
在Scala中通常使用類似函數調用的形式來訪問數組、鏈表等的元素。如:

上述調用中,"hello"(0)是"hello".apply(0)的調用。其中apply方法是StringOps類中的方法。
二、控制結構和函數
1、if語句也有返回值
if語句稱為條件表達式,如:

條件表達式的結構為: if( 判斷條件 ) 值1 else 值2 ;結構類似於 Java的三目運算符,但是Scala不支持三目運算符。
該條件表達式可以用來初始化val常量。
注:Scala中每個表達式都會返回值,如

條件表達式返回了 () ,其中 () 表示Unit類,表示沒有值。可以看作Java中的void類型。
2、Scala不支持switch語句,但是Scala有更強大的模式匹配機制。
3、塊表達式
Scala中使用 {} 括起來一系列表達式,其 {} 括起來包括 {} 的部分叫做塊表達式,塊表達式的值是塊中的最后一個表達式的值。如,
,結果為7。
可以使用塊表達式為變量賦值,如:

變量distance使用塊表達式來賦值,其值為塊中最后一個表達式的值。
4、Scala中賦值語句的返回值為Unit,也可記作:Scala中賦值語句是沒有返回值的。

【注: x = y = 3; 這種賦值形式在Scala中不支持,因為賦值語句在Scala中無返回值。 所以, += 、-= 、 ×= 、/= 等賦值操作符都是無返回值的。】
5、輸入、輸出
- 輸入:
常用的包括readLine從控制台讀取一行輸入,另外,readLine還可帶有提示字符串,如:

readInt、readByte、readDouble、readShort、readLong、readFloat、readBoolean、readChar分別用於讀取各自類型的值。
- 輸出:
print(內容)、println(內容)、printf; 其中println帶換行;另外,printf支持C風格的字符串輸出,如:

6、循環操作
Scala支持Java相同的while和do循環:

Scala的for循環結構:( for循環中,變量前面不帶var或val標志符)
1 for( 變量 <- 表達式 ){ //讓變量遍歷表達式的所有值 2 3 //操作 4 5 }
如:

7、for循環的高級用法
- 可以在for循環括號里同時包含多組" 變量 <- 表達式 "結構,組之間用分號分隔,如
1 for( i <- 1 until 3; j <- 1 until 3 ){ 2 println( i*j ) 3 }
for循環的這種結構類似Java中的嵌套循環結構。
另外,可以采用
1 for{ i <- 1 until 3 //使用大括號,使用換行來分隔組 2 j <- 1 until 3 }{ 3 4 println( i*j ) 5 }
- 可以為嵌套循環通過if表達式添加條件:

if表達式是否添加括號,結果無變化。

until 返回一個不包含上界的區間,如 1 until 3 返回 (1,2);

to方法返回一個包含善潔的區間,如 1 to 3 返回(1,2,3);
- for推導式
如果for循環以yield開始,for循環會構造出一個集合,保存到集合中。

8、Scala並不支持break和continue;
9、函數—Scala支持函數式編程
1 def 函數名(參數1:類型1, 參數2:類型2,... ):返回值類型 = { 2 3 //函數體 4 5 }
例如:

【注:對於有返回值的函數,不能省略 等號 ; 對於遞歸函數,不能省略函數返回值類型。】

【注:無返回值的函數定義時可以省略 等號 ;無返回值的函數返回類型是 Unit;】
10、帶默認值的函數

帶默認值函數的聲明,與Java中的帶默認值的方法很類似。
11、帶名參數——在函數調用時通過明確指明參數與其對應值

第一個函數調用為普通調用,第二個函數調用為帶名參數調用。
12、長度可變的參數列表
通過在函數的形參列表最后一個參數的類型后,添加*,來定義一個接受任意多個參數的函數。

13、過程,Scala中將沒有返回值的函數叫做過程,如上圖所示的函數。
過程在定義的時候,參數列表之后無等號。
14、懶值
但val被聲明為lazy時,變量的初始化將被延遲,直到我們首次對變量取值。例如:
1 lazy val fileContent = scala.io.Source.fromFile("filename").mkString
只有當我們讀取fileContent值時,fileContent才會通過讀取文件來進行初始化。若我們一直未讀取fileContent值,這文件不會被讀取。
15、Scala沒有“受檢”異常——無需聲明函數或方法可能會拋出某種異常。
