1. 程式人生 > 其它 >Scala中的流程控制

Scala中的流程控制

一、分支控制if-else

//Scala中if-else語句中,程式碼塊內最後一句程式碼就是返回值
def main(args: Array[String]): Unit = {
   var age:Int = 18;
   if (age > 18){
     "成年了"
   }else{
     "未成年"
   }
  }

注意:Scala中沒有三元運算子,由if-else替代了。

二、分支控制Switch

Scala中沒有switch語句,而是使用模式匹配來代替。

模式匹配:一個模式匹配包含了一系列備選項,每個備選項都開始於關鍵字case。每個備選項都包含一個模式及一到多個表示式。箭頭符號“=>”來隔離模式和表示式。

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))

   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
    //類似於switch中的default,case _是全匹配。 case _ => "many" } }
輸出:many

match表示式還可以有不同資料型別的模式匹配,當發現一個匹配的模式後就不會繼續往下匹配了。

def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }

三、for迴圈控制

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

1、範圍資料迴圈(to):閉區間

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

i:迴圈變數;

<-:規定;

1 to 3:1到3閉合區間;

2、範圍資料迴圈(until):左閉右開區間

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

3、迴圈守衛

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

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

等價於

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

4、迴圈步長

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

輸出:1 3 5 7 9 

:by表示步長

5、巢狀迴圈

for推導式中有多個表示式時需要用分號“;”來隔斷邏輯。當for迴圈中包含多個表示式時可以使用{}包含。

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

輸出:
1 2
1 3
1 4
2 2
2 3
2 4
3 2
3 3
3 4

6、引入變數迴圈

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

輸出:
1 -1
2 0
3 1

相當於:
   for (i <- 1 to 3){
      var j:Int = i-2
      println(i+" "+j)
    }

7、迴圈返回值

// yield後面也可以跟表示式,例如{i*2}
var res = for (i <- 1 to 3) yield i println(res) 輸出: Vector(1, 2, 3)

注意:這種方式在實際開發中很少使用。

8、倒序列印

for (i <- 1 to 4 reverse){
      print(i + " ")
    }
輸出:
4 3 2 1 

四、While迴圈

Scala中的while迴圈用法於Java一致。

五、迴圈中斷

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

1、異常中斷

def main(args: Array[String]): Unit = {
    try{
      for (i <- 1 to 10){
        print(i + " ")
        if (i== 5) throw new RuntimeException
      }
    }catch {
      case e =>
    }
    println("正常迴圈結束")
  }

2、使用Scala自帶的函式退出

import scala.util.control.Breaks._

def main(args: Array[String]): Unit = {
    breakable(
      for (i <- 1 to 10){
        print(i)
      //break省略了()
if (i == 5)break } ) }