天天看點

(資料科學學習手劄49)Scala中的模式比對

一、簡介

  Scala中的模式比對類似Java中的switch語句,且更加穩健,本文就将針對Scala中模式比對的一些基本執行個體進行介紹:

二、Scala中的模式比對

2.1 基本格式

  Scala中模式比對的基本格式如下:

  data match {

       case ... => 執行語句

       case _  => 執行語句

}

  其中,data表示将要進行模式比對的對象,match是模式比對的關鍵字,後面緊跟的{}中包含若幹條比對的方向,且隻會比對其中滿足條件的第一條;對于每一條條件,都是以case關鍵字開頭,緊跟比對的模式,且_表示比對任何模式,接着是=>,指向對應的執行語句,下面是一個簡單的示例:

object main{
  def main(args: Array[String]): Unit = {
    var data:String = "Hadoop"
    //模式比對語句
    data match {
      case "Spark" => println("No!")
      case "Hadoop" => println("Yes")
    }
    var demo = 1 match {
        //通配符_表示比對任何對象
      case _ => println("Anything!")
    }
  }
}      
(資料科學學習手劄49)Scala中的模式比對

  可以看出,在第一個模式比對語句中,比對到對應的"Hadoop"字元串對象之後,執行了對應的語句;在第二個模式比對語句中,_指定了比對任意對象,并執行了對應的輸出;

2.2 結合條件語句

  在我們的模式比對語句中,可以添加條件語句,在Scala中這叫做守衛,下面是一個簡單的例子:

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

    def isMale(Gender:Int)={
      Gender match {
        case 1 => println("Yes!Male!")
        case 0 => println("No!Female!")
          //添加守衛的模式比對語句
        case _ if Gender != 0 & Gender != 1 => println("Unknown!")
      }
    }
    //調用函數
    isMale(0)
    isMale(1)
    isMale(2)
  }
}      
(資料科學學習手劄49)Scala中的模式比對

 2.3 結合變量

  在Scala的模式比對中,我們還可以在模式語句内直接賦以新變量,來與傳入的變量結合起來,對上面的例子稍加改造得到下面這個例子:

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

    def isMale(Gender:Int)={
      Gender match {
        case 1 => println("Yes!Male!")
        case 0 => println("No!Female!")
          //添加守衛的模式比對語句
        case gender if gender != 0 & gender != 1 => {
          println("Unknown!")
          //在match語句中調用新變量
          println("gender = " + gender)
        }
      }
    }
    //調用函數
    isMale(2)
  }
}      
(資料科學學習手劄49)Scala中的模式比對

  可以看出,将match語句下的模式比對内容由常量改成新變量,會直接将傳入的待比對對象傳遞給該新變量,但該新變量的作用域隻限于match語句内,在外無法調用;

2.4 比對數組與元組

數組:

  在對數組進行模式比對時,可以配合通配符完成一些模糊比對的功能:

import scala.collection.mutable.ArrayBuffer

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

    val Demo = ArrayBuffer("Spark","Scala","Python")
    Demo match {
      case ArrayBuffer("Scala") => println("No!")
      case ArrayBuffer("Spark",_*) => println("Yes!")
      case _ => println("Warning!")
    }
  }
}      

  通過在比對内容中添加_*,來表示比對任意多的數組元素,這這裡表示比對第一個元素時"Spark",之後任意多其他元素的可變長數組;

元組:

  在比對元組時,同樣可以使用對應的文法來實作模糊比對:

object main{
  def main(args: Array[String]): Unit = {
    def fitTuple(tuple:Tuple2[Any,Any]): Unit ={
      tuple match {
        case (1,"Spark") => println("1")
          //比對第二個元素為Scala的長度為2的元組
        case (x,"Scala") => println(x)
        case _ => println("Nothing!")
      }
    }
    val t = (3,"Scala")
    fitTuple(t)
  }
}      
(資料科學學習手劄49)Scala中的模式比對

 2.5 異常處理與模式比對

  在前面的(資料科學學習手劄45)Scala基礎知識中提到過Scala中的錯誤處理機制,其實catch{}語句中的各條執行語句就是一條條的模式比對語句,這裡便不再贅述。

  以上就是Scala中關于模式比對的一些基礎内容的簡單介紹,如有筆誤,望指出。