Scala 中有 while, do while, for 循環
這裡拿常用的 for 循環來講
常用的 for 循環形式有兩種
前後閉合 (包括1 和 3)
for(i <- 1 to 3){ // 這裡的 1 to 3 也可以是一個集合
print(i + " ")
}
前閉後開(包括1 不包括 3)
for(i <- 1 until 3) {
print(i + " ")
}
循環守衛
保護式為 true 則進入循環體内部,為 false 則跳過
示例:
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
多變量
Scala 中支援多變量的循環條件, 可以用來做嵌套循環的簡化形式
這裡沒有關鍵字,是以範圍後一定要加;來隔斷邏輯
for(i <- 1 to 3; j = 4 - i) {
print(j + " ")
}
上面的代碼相當于
for (i <- 1 to 4) {
val j = 4 - i
println(s"i=${i} j=${j}")
}
嵌套
for(i <- 1 to 3; j <- 1 to 3) {
println(" i =" + i + " j = " + j)
}
上面的代碼等價于
for (i <- 1 to 3) {
for (j <-1 to 3) {
println("ok")
}
}
循環傳回值
Scala 中支援使用 yield 對循環結果進行疊代計算
val res = for(i <- 1 to 10) yield i * 2
将周遊過程中處理的結果傳回到一個新 Vector 集合中,使用 yield 關鍵字,yield 可以寫代碼塊
使用 { } 代替 ( )
for(i <- 1 to 3; j = i * 2) {
println(" i= " + i + " j= " + j)
}
// 可以寫成:
for {i <- 1 to 3
j = i * 2} {
println(" i= " + i + " j= " + j)
}
第二種形式在源碼中很常見
- { } 和 ( ) 對于for表達式來說都可以
- for 推導式有一個不成文的約定:當 for 推導式僅包含單一表達式時使用圓括号,當其包含多個表達式時使用大括号
- 當使用 { } 來換行寫表達式時,分号就不用寫了
控制步長
示例: 周遊 1-10, 步長為 3
//方式 1 使用 Range, 它是一個集合
for (i <- Range(1,10,3)) { //until
println("i=" + i)
}
//方式 2 使用守衛 [推薦]
for (i <- 1 to 10 if i % 3 == 1 ) {
println("i=" + i)
}
循環的中斷
Scala 為了更好的适應函數化程式設計, 内置控制結構特地去掉了 break 和 continue
那麼怎麼跳出循環呢? 有兩種常用方式
//使用 breakable
breakable {
for (i <- 1 to 900000) {
if (i == 99) {
break()
}
println("i=" + i)
}
}
println("程式繼續....")
//使用循環守衛
sum = 0
var flag = true
for (i <- 1 to max if flag == true) {
sum += i
if (sum > 20) {
println("使用的是循環守衛機制 目前的i=" + i)
flag = false
}
}
對于 continue, 則可以使用if – else 或是 循環守衛實作continue的效果
for (i <- 1 to 10 if (i != 4 && i != 5)) {
println("i=" + i)
}