Scala之模式匹配

Scala 提供了強大的模式匹配機制,應用也非常廣泛。一個模式匹配包含了一系列備選項,每個都開始於關鍵字 case。每個備選項都包含了一個模式及一到多個表達式。箭頭符號 => 隔開了模式和表達式。

  • 通配模式、變量匹配和守衛

通配符 “_” 可以用來匹配任意對象。通常在模式匹配中作爲最後一個匹配項,匹配其它所有的輸入對象。

  //變量常量匹配;守衛
  def varCase(input: String): Unit = {
    input match {
      case "+" => println("+")
      case "-" => println("-")
      case ch if ch.length > 1 => println(ch) //給模式添加守衛,相當於一個判斷條件
      case _ => println("_")
    }
  }
  • 類型匹配

可以根據表達式的類型進行匹配,在Scala中,我們更傾向於使用這種的模式匹配,而不是使用isInstanceOf操作符.

//類型匹配
def typeCase(input: Any): Unit = {
    input match {
      case s: String => println("This is a String var: " + input)
      case int: Int => println("This is a Int var: " + input)
      case _ => println("This is not Int and String var: " + input)
    }
  }
  • 匹配數組、列表和元組

  //匹配數組,列表和元組
  def arrayCase(arr: Array[String]): Unit = {
    arr match {
      case Array("Hello") => println("Array: Hello")
      case Array(x, y) => println("length: " + arr.length)
      case _ => println("_")
    }
  }
  //匹配列表
  def listMatch(list: List[String]): Unit = {
    list match {
      case "Hello" :: Nil => println("This list only contain hello.")
      case "Hello" :: "Scala" :: Nil => println("Hello Scala.")
      case x :: y :: Nil => println("x::y")
      case _ => println("default list.")
    }
  }
  //匹配元組
  def pairMatch(input: Any): Unit = {
    input match {
      case ("Hello", _) => println("Hello")
      case (x, "Hello", "Scala") => println(x + " Hello scala")
      case _ => println("default value")
    }
  }
  • 提取器

前面我們看到模式是如何匹配數組,列表和元組的,這些功能背後是提取器機制,帶有從對象中提取值的unapply或unapplySeq方法的對象.unapply方法用於提取固定數量的對象,而unapplySeq提取的是一個序列.

arr match {
  case Array(0, x) => ...
  ...
}

Array伴生對象就是一個提取器,定義了一個unapplySeq方法.該方法被調用時,以被執行匹配動作的表達式作爲參數.Array.unapplySeq(arr)產出一個序列的值,即數組中的值.第一個值與零進行比較,二第二個值被賦值給x.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章