前言
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)
}
偏函數
所謂偏函數, 沒有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
}
}