Scala學習——基礎篇

【《快學Scala》筆記】編程

1、基礎數組

一、變量
val 標誌符: 聲明常量; 如,val answer = 1
var 標誌符:聲明變量; app

  • 類型推斷:變量的類型由scala根據初始化變量的表達式推斷而來;

  鼓勵使用val;函數式編程

  注:聲明變量時不作初始化會報錯。函數

  • 明確類型: scala的變量或函數的類型老是寫在變量或函數的後面。
1   val a:Int = 1
2   val str:String = 2

二、經常使用類型spa

Scala支持7種數值類型和1種Boolean類型。scala

  • Byte/Char/Short/Int/Long/Float/Double
  • Boolean

注:全部這些類型都是類,Scala並未區分基本類型與引用類型。如,能夠調用1.toString方法。3d

三、數值類型轉換:code

Scala中使用方法,而非強制類型轉換來作數值類型之間的轉換。如,blog

  

四、操做符

Scala支持Java中絕大多數操做符,不過全部的操做符都是方法。如:

  a+b 是 a.+(b) 的縮寫

即:a 方法 b 是 a.方法(b) 的縮寫,兩種寫法能夠互換。

【注:Scala不支持 ++ 和 -- 操做符。】

五、函數調用和方法

經常使用數學函數包括在scala.math包中,能夠經過以下語句引入包。

1 import scala.math._     // Scala中,字符 _ 是通配符,相似Java中的*

另外,以scala開頭的包,在引入或使用時能夠省略scala。

1 import math._     
2 3 math.sqrt(2) 

【注:Scala中沒有靜態方法。】

不帶參數的方法在調用時能夠省略括號,如:

1     "hello World".toString

六、apply方法

在Scala中一般使用相似函數調用的形式來訪問數組、鏈表等的元素。如:

   

 上述調用中,"hello"(0)是"hello".apply(0)的調用。其中apply方法是StringOps類中的方法。

 

2、控制結構和函數

一、if語句也有返回值

if語句稱爲條件表達式,如:

  

條件表達式的結構爲:  if( 判斷條件 ) 值1 else 值2   ;結構相似於 Java的三目運算符,可是Scala不支持三目運算符

該條件表達式能夠用來初始化val常量。

注:Scala中每一個表達式都會返回值,如

  

條件表達式返回了 () ,其中 () 表示Unit類,表示沒有值。能夠看做Java中的void類型。

二、Scala不支持switch語句,可是Scala有更強大的模式匹配機制。

三、塊表達式

Scala中使用 {} 括起來一系列表達式,其 {} 括起來包括 {} 的部分叫作塊表達式,塊表達式的值是塊中的最後一個表達式的值。如,

  ,結果爲7。

可使用塊表達式爲變量賦值,如:

  

變量distance使用塊表達式來賦值,其值爲塊中最後一個表達式的值。

四、Scala中賦值語句的返回值爲Unit,也可記做:Scala中賦值語句是沒有返回值的。

  

【注:  x = y = 3; 這種賦值形式在Scala中不支持,由於賦值語句在Scala中無返回值。 因此, += 、-= 、 ×= 、/= 等賦值操做符都是無返回值的。】

五、輸入、輸出

  • 輸入:

  經常使用的包括readLine從控制檯讀取一行輸入,另外,readLine還可帶有提示字符串,如:

  

  readInt、readByte、readDouble、readShort、readLong、readFloat、readBoolean、readChar分別用於讀取各自類型的值。

  • 輸出:

  print(內容)、println(內容)、printf; 其中println帶換行;另外,printf支持C風格的字符串輸出,如:

  

六、循環操做

Scala支持Java相同的while和do循環:

  

Scala的for循環結構:( for循環中,變量前面不帶var或val標誌符)

1     for( 變量 <- 表達式 ){ //讓變量遍歷表達式的全部值 2       
3         //操做        
4     
5     }    

如:

  

七、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循環會構造出一個集合,保存到集合中。

  

八、Scala並不支持break和continue;

九、函數—Scala支持函數式編程

1     def 函數名(參數1:類型1, 參數2:類型2,... ):返回值類型 = {
2     
3         //函數體
4 
5     }

 

例如:

  

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

  

【注:無返回值的函數定義時能夠省略 等號 ;無返回值的函數返回類型是 Unit;】

十、帶默認值的函數

  

帶默認值函數的聲明,與Java中的帶默認值的方法很相似。

十一、帶名參數——在函數調用時經過明確指明參數與其對應值

  

第一個函數調用爲普通調用,第二個函數調用爲帶名參數調用。

十二、長度可變的參數列表

經過在函數的形參列表最後一個參數的類型後,添加*,來定義一個接受任意多個參數的函數。

  

1三、過程,Scala中將沒有返回值的函數叫作過程,如上圖所示的函數。

過程在定義的時候,參數列表以後無等號。

1四、懶值

但val被聲明爲lazy時,變量的初始化將被延遲,直到咱們首次對變量取值。例如:

1     lazy val fileContent = scala.io.Source.fromFile("filename").mkString

 

只有當咱們讀取fileContent值時,fileContent纔會經過讀取文件來進行初始化。若咱們一直未讀取fileContent值,這文件不會被讀取。

1五、Scala沒有「受檢」異常——無需聲明函數或方法可能會拋出某種異常。

相關文章
相關標籤/搜索