1. 程式人生 > >scala學習之控制結構

scala學習之控制結構

今天接著林老師的scala教程之控制結構,學習內容主要有三個,分別是if 、while、for這三個。不管哪種語言,這三種結構用的都非常非常頻繁。所以,sclala語言也不除外。

scala:if條件表示式

在Scala中,執行if語句時,會首先檢查if條件是否為真如果為真,就執行對應的語句塊,如果為假,就執行下一個條件分支。

新建test.scala ,然後 計入編輯,輸入如下內容

val x = 3
if (x>0) {
    println("This is a positive number")
} else if (x==0) {
    println("This is a zero"
) } else { println("This is a negative number") }

有一點與Java不同的是,Scala中的if表示式的值可以賦值給變數,比如:

val x = 6
val a = if (x>0) 1 else -1

————————————————————————————————————-

Scala:while迴圈

Scala中也有和Java類似的while迴圈語句。(雖然我不懂java。捂臉~……~)

var i = 9
while (i > 0) {
    i -= 1
    printf("i is %d\n"
,i) }

當為do-while語句,如下:

var i = 0
do {
    i += 1
    println(i)
}while (i<5)

———————————————————————————————————————

Scala:for迴圈

這個控制結構是最重要的,也是最常用的

Scala中的for迴圈語句格式如下:

for (變數<-表示式) 語句塊

其中,“變數<-表示式”被稱為“生成器(generator)”
下面給出一個例項:

for (i <- 1 to 5) println(i)

在上面語句中,i不需要提前進行變數宣告

可以在for語句括號中的表示式中直接使用。語句中,“<-”表示,之前的i要遍歷後面1到5的所有值。

同Range用法類似,這裡可以改變步長,比如設定步長為2,如下所示:

for (i <- 1 to 5 by 2) println(i)

這樣會得到下面結果

1
3
5

但是,有時候,我們可能不希望打印出所有的結果,我們可能希望過濾出一些滿足制定條件的結果,這個時候,就需要使用到稱為“守衛(guard)”的表示式。比如,我們只希望輸出1到5之中的所有偶數,可以採用以下語句

for (i <- 1 to 5 if i%2==0) println(i)

這樣,就只會得到1~5所有的偶數

Scala也支援“多個生成器”的情形,可以用分號把它們隔開,比如:

for (i <- 1 to 5; j <- 1 to 3) println(i*j)

執行上述程式碼後得到如下執行結果(注意輸出個數):

1
2
3
2
4
6
3
6
9
4
8
12
5
10
15

也可以給每個生成器都新增一個“守衛”,如下:

for (i <- 1 to 5 if i%2==0; j <- 1 to 3 if j!=i) println(i*j)

執行上述程式碼後得到如下執行結果:

2
6
4
8
12

for推導式

有時候,我們需要對上述過濾後的結果進行進一步的處理,這時,就可以採用yield關鍵字,對過濾後的結果構建一個集合。比如,我們可以採用以下語句:

scala> for (i <- 1 to 5 if i%2==0) yield i
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)

上面這種帶有yield關鍵字的for迴圈,被稱為“for推導式”。這個概念源自函數語言程式設計,也就是說,通過for迴圈遍歷一個或多個集合,對集合中的元素進行“推導”,從而計算得到新的集合,用於後續的其他處理.

____________________________2017.03.03_________________________________________
總結下:依我看來,
(1)上面的三個控制結構都很重要,if和while可以劃歸為一類。它們後面都是判斷語句,如果為真,就執行對應的語句塊,如果為假,就執行下一個條件分支。
(2)for和上面的兩類不是很一樣,for語句“生成器”裡面的“守衛”是一個技巧,要掌握。