Scala語法(四) 模式匹配

前言

Scala中的模式其實和Java中的switch類似. Scala中對於Java內的switch進行了擴展, 例如數組模式匹配、List模式匹配、偏函數等. 其功能要遠遠強於Java的簡單的switch匹配.


正文

基本匹配

下方的例子中包含了多種模式匹配. 主要包括:

  • 字符串匹配
  • 混合數據類型匹配
  • 數組模式匹配
  • List模式類型
  • 元組模式匹配
import org.junit.Test
import scala.util.Random

/**
 * Scala內的模式匹配.
 * 
 * */
class CaseMatch {
  
  // 字符串匹配
//  @Test
  def caseMatchString{
    // 定義需要匹配的數組
    val arr = Array("Sean","Abel","Bruce")
    // 隨機指定一個字符串
    val name = arr(Random.nextInt(arr.length))
    
    println(name)
    name match{
      case "Sean" => println("Sean is a good people.")
      case "Abel" => println("Abel is a good gay.")
      case _ => println("default matches.")
    }
  }
  
  // 混合數據類型匹配
//  @Test
  def caseMatchFix{
     val arr = Array("Sean",1.0,2)
     // 隨機指定一個變量
     val variable = arr(Random.nextInt(arr.length))
     println(variable)
     
     variable match{
       case str:String  => if(str.equals("Sean")){println("String Sean.")}
       case num:Int => println("Int Number: "+num)
       case num:Double => println("Double Number"+num)
       case _ => throw new Exception("Not Match Exception.s")
     }
  }
  
  // 模式匹配數組類型
//  @Test
  def caseMatchArray{
    val arr = Array(0,1,5)
    // _* 表示可以匹配任意多的參數
    arr match{
      case Array(1,x,y) => println(x+" "+y)
      case Array(0,1,5) => println("Only 0")
      case Array(0, _*) => println("0...")
      case _ => println("Something Else.")
    }
  }
  
  // 模式匹配List數據類型
  @Test
  def caseMatchList{
//    val lst = List(0,3,111)
      val lst = List(0,3)
    // List包括2哥部分組成 (head,tail)
    // Nil 表示尾部是一個空的List
    lst match{
      case 0 :: Nil => println("Only 0")
      // 加s字符串進行轉義
      case x ::y::Nil => println(s"x: $x y:$y")
      // a
      case 0 :: a => println("0...")
      case _ => println("Something else.")
    }
  }
  
  // 模式匹配元組
  @Test
  def caseMatchTuple{
    val tup = (6,3,5)
    tup match {
      case (1,x,y) => println(s" 1,$x,$y")
      case (_,z,5) => println(z)
      case _ => println("else")
    }
  }
  
}


樣例類與類模式匹配

樣例類case class, 快速創建的類.其中, 會自動生成部分方法. 除了樣本類之外, 還有樣例對象case object.

// 上訴樣例類可能不在一個文件內, 需要手動導入.
case class SubmitTask(id:String, name:String)
case class HeartBeatTask(time:Long)
case object CheckTimeoutTask

class CaseMatchClass {
  
  // 根據提交的任務進行模式匹配進行判斷
  
  @Test
  def caseMatch{
    // 樣例類可以new, 也可以不new出來.
     val arr = Array(CheckTimeoutTask,HeartBeatTask(123),SubmitTask("0001","Task-001"))
     val obj = arr(Random.nextInt(arr.length))
     obj match{
       case SubmitTask(id,name) =>{
         println("SubmitTask.")
       }
       case HeartBeatTask(time) =>{
         println("HeartBeatTask.")
       }
       case CheckTimeoutTask => {
         println("CheckTimeoutTask.")
       }
     }
  }
  
  • Option類型匹配
    對於Map數據類型內的對象. 不確定內部對象是否存在. 我們在使用時也可以對其進行模式匹配. 但是個人還是推薦使用getOrElse(<>,<>)方法較爲方便一點.
 // Option類型匹配
 @Test
 def caseMatchOption{
   // Some是有值 None是否有值
   val map = HashMap(("a",1),("b",2))
   val v = map.get("b")
   v match {
     case Some(i) => i
     case None => println("Null")
   }
   
   // 同時也可以通過getOrElse來進行實現
   // getOrElse就是通過match方法進行實現的.
   val v2 = map.getOrElse("b", 0)
   
 }
 

Scala–樣例類(case)詳解

偏函數

所謂偏函數, 沒有match, 只有case的一段語句塊. 其需要書寫成def caseMatchFunctionA1 : PartialFunction[Int,Int] ={}的形式.

// 偏函數
  @Test
  def caseMatchFunctionA(num:Int) : Int = num match{
    case 1 => 1
    case 2 => 2
    case _ => -1
  }
  
  // 偏函數的寫法 PartialFunction[輸入參數類型,輸出函數類型]
  @Test
  def caseMatchFunctionA1 : PartialFunction[Int,Int] = {
    case 1 => 1
    case 2 => 2
    case _ => -1
  }
    
  @Test
  def caseMatchFunctionB(str:String) : Int = str match{
    case "one" => 1
    case "two" => 2
    case _ => -1
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章