Scala(四)之 流程控制

子清.發表於2020-10-26

4. 流程控制

4.1 分支控制if-else

4.1.1 單分支

1)基本語法

if  (條件表示式)  {
	執行程式碼塊
}

4.1.2 雙分支

1)基本語法

if (條件表示式) {
	執行程式碼塊1
} else {
執行程式碼塊2
}

4.1.3 多分支

1)基本語法

if (條件表示式1) {
	執行程式碼塊1
}
else if (條件表示式2) {
	執行程式碼塊2
}
   ……
else {
	執行程式碼塊n
}

注意:

1.Scala中if else表示式其實是有返回值的,具體返回值取決於滿足條件的程式碼體的最後一行內容。

2.Scala中返回值型別不一致,取它們共同的祖先型別。

3.如果大括號{}內的邏輯程式碼只有一行,大括號可以省略。如果省略大括號,if只對最近的一行邏輯程式碼起作用。

4.2 巢狀分支

在一個分支結構中又完整的巢狀了另一個完整的分支結構,裡面的分支的結構稱為內層。分支外面的分支結構稱為外層分支。巢狀分支不要超過3層。

1)基本語法

if(){
	if(){

	}else{

	}	
}

2)案例實操

需求:如果輸入的年齡小於18,返回“童年”。如果輸入的年齡大於等於18,需要再判斷:如果年齡大於等於18且小於30,返回“中年”;如果其他,返回“老年”。

object TestIfElse  {
    def main(args: Array[String]): Unit = {

        println("input age")
        var age = StdIn.readInt()

        val res :String = if (age < 18){
            "童年"
        }else {
            if(age>=18 && age<30){
                "中年"
            }else{
                "老年"
            }
        }

        println(res)
    }
}

4.3 Switch分支結構

在Scala中沒有Switch,而是使用模式匹配來處理。

4.4 For迴圈控制

Scala也為for迴圈這一常見的控制結構提供了非常多的特性,這些for迴圈的特性被稱為for推導式或for表示式。

4.4.1 範圍資料迴圈(To)

1)基本語法

for(i <- 1 to 3){
    print(i + " ")
}
println()

(1)i 表示迴圈的變數,<- 規定to

(2)i 將會從 1-3 迴圈,前後閉合

4.4.2 範圍資料迴圈(Until)

1)基本語法

for(i <- 1 until 3) {
    print(i + " ")
}
println()

(1)這種方式和前面的區別在於i是從1到3-1

(2)即使前閉合後開的範圍

4.4.3 迴圈守衛

1)基本語法

for(i <- 1 to 3 if i != 2) {
    print(i + " ")
}
println()

(1)迴圈守衛,即迴圈保護式(也稱條件判斷式,守衛)。保護式為true則進入迴圈體內部,為false則跳過,類似於continue。

(2)上面的程式碼等價

for (i <- 1 to 3){
	if (i != 2) {
		print(i + " ")
	}
}

4.4.4 迴圈步長

1)基本語法

for (i <- 1 to 10 by 2) {
    println("i=" + i)
}

結果

i=1
i=3
i=5
i=7
i=9

說明:by表示步長

4.4.5 巢狀迴圈

1)基本語法

for(i <- 1 to 3; j <- 1 to 3) {
    println(" i =" + i + " j = " + j)
}

說明:沒有關鍵字,所以範圍後一定要加;來隔斷邏輯

2)基本語法

上面的程式碼等價

for (i <- 1 to 3) {
    for (j <- 1 to 3) {
        println("i =" + i + " j=" + j)
    }
}

4.4.6 引入變數

1)基本語法

for(i <- 1 to 3; j = 4 - i) {
    println("i=" + i + " j=" + j)
}

說明:

(1)for推導式一行中有多個表示式時,所以要加 ; 來隔斷邏輯

(2)for推導式有一個不成文的約定:當for推導式僅包含單一表示式時使用圓括號,當包含多個表示式時,一般每行一個表示式,並用花括號代替圓括號,如下

for {
    i <- 1 to 3
j = 4 - i
} {
    println("i=" + i + " j=" + j)

練習

object Test1026 {
  def main(args: Array[String]): Unit = {
    for(i<- 1 to 18 by 2; j=(18-i)/2){
      println(" "*j+"*"*i)
    }
  }
}
        *
       ***
      *****
     *******
    *********
   ***********
  *************
 ***************
*****************

4.4.7 迴圈返回值

1)基本語法

val res = for(i <- 1 to 10) yield i
println(res)

說明:將遍歷過程中處理的結果返回到一個新Vector集合中,使用yield關鍵字。

注意:開發中很少使用。

2)案例實操

​ 需求:將原資料中所有值乘以2,並把資料返回到一個新的集合中。

object TestFor {

    def main(args: Array[String]): Unit = {

        var res = for(i <-1 to 10) yield {
            i * 2
        }

        println(res)
    }
}

4.4.8 倒序列印

1)說明:如果想倒序列印一組資料,可以用reverse。

2)案例實操:

需求:倒序列印10到1

for(i <- 1 to 10 reverse){
    println(i)
}

或者將步長設為-

for(i <- 10 to 1 by -1){
      println(i)
    }

4.5 While和do…While迴圈控制

While和do…While的使用和Java語言中用法相同。

4.5.1 While迴圈控制

1)基本語法

迴圈變數初始化
while (迴圈條件) {
      迴圈體(語句)
      迴圈變數迭代
}

說明:

(1)迴圈條件是返回一個布林值的表示式

(2)while迴圈是先判斷再執行語句

(3)與for語句不同,while語句沒有返回值,即整個while語句的結果是Unit型別()

(4)因為while中沒有返回值,所以當要用該語句來計算並返回結果時,就不可避免的使用變數,而變數需要宣告在while迴圈的外部,那麼就等同於迴圈的內部對外部的變數造成了影響,所以不推薦使用,而是推薦使用for迴圈。

2)案例實操

需求:輸出10句 “zmzdmx”

object TestWhile {
    
    def main(args: Array[String]): Unit = {

        var i = 0

        while (i < 10) {
            println("zmzdmx" + i)
            i += 1
        }
    }
}

4.5.2 do…while迴圈控制

1)基本語法

迴圈變數初始化;
   do{
       迴圈體(語句)
       迴圈變數迭代
   } while(迴圈條件)

​ 說明

(1)迴圈條件是返回一個布林值的表示式

(2)do…while迴圈是先執行,再判斷

2)案例實操

需求:輸出10句 “zmzdmx”

object TestWhile {

    def main(args: Array[String]): Unit = {

        var i = 0

        do {
            println("zmzdmx" + i)
            i += 1
        } while (i < 10)
    }
}

4.6 迴圈中斷

1)基本說明

Scala內建控制結構特地去掉了break和continue,是為了更好的適應函數語言程式設計,推薦使用函式式的風格解決break和continue的功能,而不是一個關鍵字。Scala中使用breakable控制結構來實現break和continue功能。

2)案例實操

需求1:採用異常的方式退出迴圈

def main(args: Array[String]): Unit = {

    try {
        for (elem <- 1 to 10) {
            println(elem)
            if (elem == 5) throw new RuntimeException
        }
    }catch {
        case e =>
    }
    println("正常結束迴圈")
}

需求2:採用Scala自帶的函式,退出迴圈

import scala.util.control.Breaks

def main(args: Array[String]): Unit = {

    Breaks.breakable(
        for (elem <- 1 to 10) {
            println(elem)
            if (elem == 5) Breaks.break()
        }
    )

    println("正常結束迴圈")
}

需求3:對break進行省略

import scala.util.control.Breaks._

object TestBreak {

    def main(args: Array[String]): Unit = {
    
        breakable {
            for (elem <- 1 to 10) {
                println(elem)
                if (elem == 5) break
            }
        }
    
        println("正常結束迴圈")
    }
}

需求4:迴圈遍歷10以內的所有資料,奇數列印,偶數跳過(continue)

object TestBreak {

    def main(args: Array[String]): Unit = {

        for (elem <- 1 to 10) {
            if (elem % 2 == 1) {
                println(elem)
            } else {
                println("continue")
            }
        }
    }
}

4.7 多重迴圈

1)基本說明

(1)將一個迴圈放在另一個迴圈體內,就形成了巢狀迴圈。其中,for,while,do…while均可以作為外層迴圈和內層迴圈。【建議一般使用兩層,最多不要超過3層】

(2)設外層迴圈次數為m次,內層為n次,則內層迴圈體實際上需要執行m*n次。

2)案例實操

需求:列印出九九乘法表

object TestWhile {

    def main(args: Array[String]): Unit = {

        for (i <- 1 to 9) {

            for (j <- 1 to i) {
                print(j + "*" + i + "=" + (i * j) + "\t")
            }

            println()
        }
    }
}

相關文章