Scala模式匹配-值匹配與簡單類型匹配

在Scala的模式匹配中,可以使用類型、通配符、序列、正則表達式,甚至可以深入獲取對象的狀態。這種對象狀態的獲取遵循一定的協議,也就是對象內部狀態的可見性由該類型的實現來控制,這樣我們就可以獲取暴露的狀態並應用於變量中。對象的獲取往往被稱爲“提取”或者“解構”。

1、簡單匹配

簡單匹配有點類似Java中的Switch語句,會匹配每一個確定的值。具體如下:

 def match_boolean(): Unit ={
    val bools = Seq(true,false)
    for(bool <- bools){
      bool match {
        case true => println("Got heads")
        case false => println("Got tails")
      }
    }
  }

在上述代碼中,首先創建了一個序列,針對每一個元素使用match匹配,其匹配可能性只存在true和false兩種情況。這與大多數語言的模式匹配是一致的,當然一般開發中的匹配是比較複雜的,上述代碼只是作爲實例代碼而已。

2、match中的值、變量和類型

Scala中,模式匹配可以使用值、變量、類型作爲匹配內容。以下例子能匹配特定得某個值(與Java得switch相似),也可以匹配特定類型,如:判定是字符串、Double等。

def match_any():Unit={
    for{x <- Seq(1,2,2.7,"one","two",'four)}{
      val str = x match {
        case 1  => "int 1" //匹配值爲1的整數
        case i:Int => "other int: " + i //匹配非1的整形內容,將匹配項賦值給變量i
        case d: Double => "a double: " + x//匹配Double類型內容,將匹配項賦值給變量d
        case "one" => "string one"//匹配字符串爲“one”
        case s: String => "other string:" + s//匹配除“one”的其他字符串
        case unexpected => "unexpected value:" + unexpected//除以上幾種匹配的所以模式
      }
      println(str)
    }

對於上邊實例,只是爲了演示模式匹配效果,並且可以將需要匹配內容直接賦值給另外一個變量。當然上述示例中沒有任何意義,無論是i或者d都是與x相同。但是這種語法可以方便我們匹配Tuple類型等,可以直接將Tuple類型解析,如:case (v1:Int,v2:Int) => "v1:"+v1+",v2:"+v2這段代碼代碼表示,如果匹配項是一個Tuple2類型,那麼將.1賦值給v1,將._2賦值給v2。這樣就可以在後續表達式中直接使用v1、v2兩個變量。當然對於上述示例,就不需要特意定義變量,可以直接使用佔位符(““)即可。 具體代碼如:

 def match_any():Unit={
    for{x <- Seq(1,2,2.7,"one","two",'four)}{
      val str = x match {
        case 1  => "int 1" //匹配值爲1的整數
        case _:Int => "other int: " + _ //匹配非1的整形內容,將匹配項賦值給變量i
        case _: Double => "a double: " + x//匹配Double類型內容,將匹配項賦值給變量d
        case "one" => "string one"//匹配字符串爲“one”
        case _: String => "other string:" + _//匹配除“one”的其他字符串
        case unexpected => "unexpected value:" + unexpected//除以上幾種匹配的所以模式
      }
      println(str)
    }
  }

到現在,我們接觸的模式匹配都是使用靜態量匹配,或者使用類型等。但是,在Scala中,我們可以使用已經定義的變量來匹配(這可能是一個很大的驚喜哦,在實際開發中,可以用來根據不同條件提取數據)。具體如:

  def match_variable(y:Int):Unit = {
    for {
      x <- Seq(99,100,101)
    }{
      val str = x match {
        case `y` => "found y!"//需要特別注意,這裏不可以使用case y,必須用反引號來引用變量
        case _:Int =>s"int:$x"
      }
      println(str)
    }
  }

我們首先通過函數參數傳入變量y,然後在匹配中,引用y來與匹配項比較,如果匹配成功,則執行後續代碼。需要特別注意,在使用變量匹配時,必須用反引號“`”來包圍變量,如上例中“y”。
像Java中,一般可能會針對多種匹配類型執行同樣操作,我們一般會在最後一條滿足條件的判斷上寫入需要執行的操作,然後break,如:

 switch (i){
            case 'a':
            case 'b':
                System.out.println("print");
                break;
        }

Scala中也支持針對不同的匹配子句需要使用相同的處理代碼的情況,而且代碼邏輯更簡單明瞭。

 x match {
      case 'a' | 'b' => println(x)
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章