天天看點

Scala 優雅入門 (三) for 循環常用的 for 循環形式有兩種循環守衛多變量嵌套循環傳回值使用 { } 代替 ( )控制步長循環的中斷Scala 優雅入門 (四) 函數式程式設計

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)
}
           

Scala 優雅入門 (四) 函數式程式設計