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不需要提前進行變數宣告
同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語句“生成器”裡面的“守衛”是一個技巧,要掌握。