普通匹配
匹配常量玩徊;類型;模式守衛(wèi)
x match{
case "a" => println("11")
case a:String if a!=null&&a=="b"=>println(s"$a +String")
case b:String =>{
println("hhh")
}
//若無默認值谨究,拋出MatchError異常
case _ => println("default")
}
匹配數(shù)組
for (arr<-Array(
Array(0),
Array(0,1),
Array(1,2,1),
Array(1,2,3,4),
Array(1,3.5,"2",'c')))
{
val result = arr match{
case Array(0)=>"0"
case Array(x,y)=>x+" "+y
case Array(_,2,_)=>"..."
case Array(_*)=>"all"
case _=>"_"
}
println(result)
}
匹配列表
方式二(方式一與匹配數(shù)組相同)
val list:List[Int] = List(1,2,3,4,5)
list match {
case first::second::rest=>println(first+"--"+second+"--"+rest)
case _=>println("_")
}
匹配元組
for (tuple<-Array((0,1),(1,2),(2,3),(3,4),(4,5,6))){
val result = tuple match {
case (0,_)=>"..."
case (x,2)=>"x,2."
case (x,y)=>"x,y"
case(x,5,_)=>x+" "+5
}
println(result)
}
元組特殊匹配
1)在變量聲明時匹配
val List(first,second,_*) = List(1,2,3,4,5)
val (x,y) = (1,2)
val fir::sec::rest = List(23,15,9,78)
2)for循環(huán)使用
val list = List((1,2),(3,4),(5,6))
for ((x,y)<-list){
println(x,y)
}
匹配對象及樣例類
概念
1)若只提取對象的一個屬性恩袱,則提取器為 unapply(obj:Obj):Option[T]
2)若提取對象的多個屬性,則提取器為 unapply(obj:Obj):Option[(T1,T2,T3…)]
3)若提取對象的可變個屬性胶哲,則提取器為 unapplySeq(obj:Obj):Option[Seq[T]]
2.樣例類仍然是類畔塔,和普通類相比,只是其自動生成了伴生對象鸯屿,并且伴生對象中
自動提供了一些常用的方法澈吨,如 apply、 unapply寄摆、 toString缔刹、 equals圆凰、 hashCode 和 copy杆融。
3.樣例類是為模式匹配而優(yōu)化的類畅涂,因為其默認提供了 unapply 方法,因此勾邦,樣例
類可以直接使用模式匹配蚣录,而無需自己實現(xiàn) unapply 方法。
4.構(gòu)造器中的每一個參數(shù)都成為 val眷篇,除非它被顯式地聲明為 var(不建議這樣做)
1)不使用樣例類
class ydtsnm(val name: String,val id:Int)
object ydtsnm {
def apply(name:String,id:Int): ydtsnm = new ydtsnm(name,id)
def unapply(stu: ydtsnm): Option[(String, Int)] = {
if (stu==null)None
else Some(stu.name,stu.id)
}
}
object test{
val result = ydtsnm("aaa",1) match {
case ydtsnm("aaa",1)=>"yes"
case _=>"no"
}
}
2)使用樣例類
case class ydtsnm(val name: String,val id:Int)
object test{
val result = ydtsnm("aaa",1) match {
case ydtsnm("aaa",1)=>"yes"
case _=>"no"
}
}