普通匹配
匹配常量;类型;模式守卫
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")
}
匹配数组
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)
}
匹配列表
方式二(方式一与匹配数组相同)
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循环使用
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.样例类是为模式匹配而优化的类,因为其默认提供了 unapply 方法,因此,样例
类可以直接使用模式匹配,而无需自己实现 unapply 方法。
4.构造器中的每一个参数都成为 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"
}
}