天天看點

學習大資料:Scala

Scala 基礎文法

1.1 聲明變量

1)以 val 定義一個常量(無法改變其内容):

scala> val name="zhangsan"
name: String = zhangsan

scala> name="lisi"
<console>:12: error: reassignment to val
       name="lisi"
           ^           

2)以 var 定義一個可修改值的變量:

scala> var age=20
age: Int = 20           

注:在scala中,我們鼓勵你使用 val ——除非你真的需要改變它的内容。

3)多種定義變量的形式

scala> val msg:String = "hello"
msg: String = hello

scala> val msg:Any = "hello"
msg: Any = hello

scala> val msg = "hello"
msg: String = hello           

4)scala 常用類型

和 Java 一樣,scala 也有7種數值類型:Byte、Char、Short、Int、Long、Double、Float,以及一個Boolean類型(注意首字母大寫)。跟Java不同的是,這些類型都是類。

1.2 算術和操作符重載

Scala 的算術操作符和在 Java 中的效果是一樣的:+—*/%等操作符完成的是它們通常的工作,位操作符&|^>><<也一樣。隻有一點特别的是:這些操作符實際上是方法,例如:

a + b
是如下方法調用的簡寫
a.+(b)           

這裡的+是方法名,Scala 并不會對非字母或數字的方法名有偏見。又如:

scala> 1.to(10)
可以寫成
scala> 1 to 10
res0: scala.collection.immutable.Range.Inclusive = Range 1 to 10           

1.3 控制結構

1)條件表達式

Scala 中的if/else表達式有值,這個值就是跟在if或else之後的表達式的值:

scala> val i = 1
i: Int = 1

scala> val s = if(i > 0) 1 else -1
s: Int = 1
混合類型表達式的傳回值類型是公共超類型 Any
scala> val s = if(i > 0) 1 else "error"
s: Any = 1           

2)語句終止

Scala 中和JavaScript 等其它腳本語言類似——行尾的位置不需要分好,若想在單行中寫下多個語句可以用分号隔開。

3)循環語句

Scala擁有于Java和C++相同的while和do循環:

while(n > 0) {
    r = r*n
    n-= 1
}           

Scala的for循環差別于以往:

for(i<- 1 to n)
    r = r * i           

1 to n傳回數字1到數字n(含)的Range(區間);周遊字元串或數字時,往往需要使用從0 到n-1的區間,這時可以用until方法而非to方法,如周遊字元串:

val s = "Hello"
var sum = 0
for (i <- 0 until s.length)
    sum += s(i)

// 等價于如下寫法
for (ch <- "Hello")
    sum += ch           

進階 for 循環和 for 推導

以 變量<- 表達式 的形式提供多個生成器,用分号隔開:

scala> for (i <- 1 to 3 ; j <- 1 to 3) print((10*i+j) + " ")
11 12 13 21 22 23 31 32 33            

每個生成器都可以帶一個守衛,以if開頭的Boolean表達式:

scala> for (i <- 1 to 3 ; j <- 1 to 3 if i!=j) print((10*i+j) + " ")
12 13 21 23 31 32            
scala> for (i <- 1 to 3 ; form = 4-i ; j <- form to 3) print((10*i+j) + " ")
13 22 23 31 32 33           
scala> var v = for( i <- 1 to 10) yield i % 3
v: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)           
scala> for ( c <- "Hello" ; i <- 0 to 1) yield (c + i).toChar
res6: String = HIeflmlmop

scala> for ( i <- 0 to 1 ; c <- "Hello") yield (c + i).toChar
res7: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)