1. 程式人生 > >Scala基本語法總結(一)

Scala基本語法總結(一)

Scala基本語法總結

時隔快一年了,又撿起scala,不是想學的有多麼的精通,只是想把之前遇到的知識點和實踐中遇到的重點進行歸納總結,對以後的面試或許有點幫助吧!

一、scala開發環境的配置

我這裡分享一下有道雲筆記的地址,有之前學習的時候對scala的安裝方法的詳細描述,有興趣的可以看看
http://note.youdao.com/noteshare?id=92d3d18863c6273da580130bddfc4890&sub=09306077167D4C6882E089FE4A390BAE

二、scala的基本語法

1、定義變數

  • val:val類似於Java中的final變數,一旦初始化之後,不可以重新賦值(我們可以稱它為常量)
  • var:var 類似於一般的非final變數。可以任意重新賦值。

Scala 可以根據賦值的內容推算出變數的型別,如:(一般情況都是用推算的方式定義的)

scala> val msg="Hello,World"
msg: String = Hello,World

你也可以在定義變數的時候指定他的型別,如:

scala> val msg2:String ="Hello again,world"
msg2: String = Hello again,world

2、定義函式

Scala 既是面向物件的程式語言,也是面向函式的程式語言,因此函式在 Scala 語言中的地位和類是同等第一位的。

scala> def max(x:Int,y:Int) : Int ={
     | if (x >y) x
     | else
     | y
     | }
max: (x: Int, y: Int)Int

Scala 函式以 def 定義,然後是函式的名稱(如 max),然後是以逗號分隔的引數。Scala 中變數型別是放在引數和變數的後面,以“:”隔開。同樣如果函式需要返回值,它的型別也是定義在引數的後面(實際上每個 Scala 函式都有返回值,只是有些返回值型別為 Unit,類似為java語言中的 void 型別)。

每個 Scala 表示式都有返回結果(這一點和 Java,C# 等語言不同),比如 Scala 的 if else 語句也是有返回值的,因此函式返回結果無需使用 return 語句。實際上在 Scala 程式碼應當儘量避免使用 return 語句。函式的最後一個表示式的值就可以作為函式的結果作為返回值。大多數函式 Scala 都可以推測出函式返回值的型別,但目前來說回溯函式(函式呼叫自身)還是需要指明返回結果型別

的。

3、使用 while 配合 if 實現迴圈

var i=0
while (i < args.length) {
  println (args(i))
  i+=1
}

執行方式和結果:

這裡要注意的是:

  • Scala 不支援 ++i,i++ 運算子,因此需要使用 i += 1 來加一
  • Scala訪問陣列的語法是使用()而非[]。
  • args 接收傳遞的引數列表

這裡介紹了使用 while 來實現迴圈,但這種實現迴圈的方法並不是最好的 Scala 風格,下面介紹一種更好的方法來避免通過索引來列舉陣列元素。

4、使用 foreach 和 for 來實現迭代

上面使用 while 來實現迴圈,和使用 Java 實現無太大差異,而 Scala 是面向函式的語言,更好的方法是採用“函式式“風格來編寫程式碼。比如上面的迴圈,使用 foreach 方法如下:

args.foreach(arg => println(arg))

該表示式,呼叫 args 的 foreach 方法,傳入一個引數,這個引數型別也是一個函式。這段程式碼可以再寫的精簡些,你可以利用 Scala 支援的縮寫形式,如果一個函式只有一個引數並且只包含一個表示式,那麼你無需明確指明引數。因此上面的程式碼可以寫成:

args.foreach( println)

Scala 中也提供了一個稱為 “for comprehension” 的比 Java 中 for 表示式功能更強大。“for comprehension” ,這裡先使用 for 來實現前面的例子:

for (arg <-args)
  println(arg)

5、陣列的定義和應用

在 Scala 中你可以使用 new 來例項化一個類。當你建立一個物件的例項時,你可以使用數值或型別引數。如果使用型別引數(指定你定義的陣列的型別),它的作用類似 Java 中的型別。所不同的是 Scala 使用方括號來指明資料型別引數,而非尖括號(java)。比如

val greetStrings =new Array[String](3)
greetStrings(0)="Hello"
greetStrings(1)=","
greetStrings(2)="world!\n"
for(i <- 0 to 2)
  print(greetStrings(i))

可以看到 Scala 使用[]來為陣列指明型別化引數,本例使用 String 型別,陣列使用()而非[]來指明陣列的索引。其中的 for 表示式中使用到 0 to 2 ,這個表示式演示了 Scala 的一個基本規則,如果一個方法只有一個引數,你可以不用括號和. 來呼叫這個方法。因此這裡的 0 to 2, 其實為(0).to(2) 呼叫的為整數型別的 to 方法,to 方法使用一個引數。

Scala 中所有的基本資料型別也是物件(和 Java 不同),因此 0 可以有方法(實際上呼叫的是 RichInt 的方法),這種只有一個引數的方法可以使用操作符的寫法(不用.和括號),實際上 Scala 中表達式 1+2,最終解釋為 (1).+(2) + 也是 Int 的一個方法,和 Java 不同的是,Scala 對方法的名稱沒有太多的限制,你可以使用符合作為方法的名稱。

這裡說明一下為什麼 Scala 中使用()來訪問陣列元素。在 Scala 中,陣列和其它普遍的類定義一樣,沒有什麼特別之處,當你在某個值後面使用()時,Scala 將其翻譯成對應物件的 apply 方法。因此本例中 greetStrings(1) 其實呼叫 greetString.apply(1) 方法。這種表達方法不僅僅只限於陣列,對於任何物件,如果在其後面使用(),都將呼叫該物件的 apply 方法。同樣的如果對某個使用()的物件賦值,比如:

greetStrings(0)="Hello"

Scala 將這種賦值轉換為該物件的 update 方法, 也就是 greetStrings.update(0,”hello”)。因此上面的例子,使用傳統的方法呼叫可以寫成:

val greetStrings =new Array[String](3)
greetStrings.update(0,"Hello")
greetStrings.update(1,",")
greetStrings.update(2,"world!\n")
for(i <- 0 to 2)
  print(greetStrings.apply(i))

不過 Scala 還是提供了初始化陣列的簡單的方法,比如初始化陣列可以使用如下程式碼:

val greetStrings =Array("Hello",",","World\n")

這裡使用()其實還是呼叫 Array 類的關聯物件 Array 的 apply 方法,也就是

val greetStrings =Array.apply("Hello",",","World\n")

陣列總結幾點如下:

  • 使用 [] 來為陣列指明型別
  • 使用 () 來指明陣列的索引
  • Scala 中所有的基本資料型別也是物件,因此可以使用(1).+(2),(0).to(2), +和to都是Int的方法
  • Scala 的一個基本規則,如果一個方法只有一個引數,你可以不用括號和. 來呼叫這個方法,比如:1+2,0 to 2
  • 對於任何物件,如果在其後面使用(),都將呼叫該物件的 apply 方法
  • 物件的賦值語句,都將轉化成該物件的update方法