Scala學習——基礎篇


【《快學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沒有“受檢”異常——無需聲明函數或方法可能會拋出某種異常。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM