模式匹配應用場景:switch語句,類型查詢,析構,樣例類git
1、更好的switch數組
val ch :Char = '+' val sign = ch match{ case '+' => 1 case '-' => -1 case _ => 0 } println(sign)
case _ 匹配其餘狀況,case 結尾不須要break跳出app
2、守衛spa
val ch :Char = '9' var digit = 0 val sign = ch match{ case '+' => 1 case '-' => -1 case _ => 0 case _ if Character.isDigit(ch) => digit = Character.digit(ch,10) //case _ => 0 } println(sign,digit)
守衛能夠是任何Boolean條件; 匹配是順序下來的,上面的例子是匹配不到守衛的。code
3、模式中的變量對象
case _ 看作是這個特性的一個特殊狀況。blog
4、類型模式虛擬機
var str =1 def f(s : Any) = s match{ case i : Int => println("int="+i) case s : String=> println("str="+s) case m : Map[String,Int]=> println("map="+m) //Map中的類型匹配是無效的 case _ => println("unknown") } f(1) f("Hello") f(Map((1,2)))
結果:it
int=1 str=Hello map=Map(1 -> 2)
Map中的類型匹配是無效的,結果爲class
Map(1 -> 2)
匹配發生在運行期,Java虛擬機中的泛型信息是被擦掉的。
5、匹配數組、列表和元組
數組:
def f (str: Any) = str match{ case Array() => "0" case Array(x,y) => x + " " + y case Array(0, _*) => "0..." case _ => "something else" } println(f(Array(1,3))) println(f(Array(0,1,3)))
1 3 0...
列表:
def fl (str: Any) = str match{ case 0::Nil => "0" case x::y::Nil => x + " " + y case 0::tail => "0..." case _ => "something else" } println(fl(List(0))) println(fl(List(1,3))) println(fl(List(0,1,3)))
0 1 3 0...
元組:
def ft (str: Any) = str match{ case (0,_) => "0" case (x,y)=> x + " " + y case (x,0,_) => "0..." case _ => "something else" } println(ft(Tuple2(0,1))) println(ft(Tuple3(1,0,2))) println(ft(Tuple4(1,0,2,3)))
0 0... something else
6、提取器
模式匹配數組,元組,列表,這些背後是提取器機制。對象中有unapply或unapplySeq方法對值進行提取。
unapply方法用於提取固定數量的對象,unapplySeq提取的是一個序列。
7、變量聲明中的模式
val (x,y)=(1,2)