Scala match模式匹配
模式匹配,可以使用,值、变量、类型、通配符、序列、正则表达式、对象状态等
case返回值类型为“最近公共父类型”
for (x <- List(1, 2, 2.1, "scala", 'spark, "MLlib"); a = 2.1; b = "MLlib") {
val str = x match {
case 1 => "spark1.0.0"
case _: Int => "spark1.2.0"
case _: Double => "spark1.3.0"
// case _: Int | _: Double => "spark1.2.2--spark1.3.1"
case `a` => "spark1.4.0"
case "one" => "spark1.5.0"
case `b` => "spark1.6.0"
case _: String => "spark1.6.2"
case _ => "spark2.0.0"
}
println(str)
}
序列的匹配
val st=List("Scala","Spark","DataSet","RDD","MLlib","GraphX")
st: List[String] = List(Scala, Spark, DataSet, RDD, MLlib, GraphX)
def m1[T](x:List[T]):String=x match{
case head+:tail=>s"$head+:"+tail
case Nil=>"Nil"
}
Scala+:List(Spark, DataSet, RDD, MLlib, GraphX)
def m2[A](x:List[A]):String=x match{
case head+:tail=>s"$head+:"+m2(tail)
case Nil=>"Nil"
}
Scala+:Spark+:DataSet+:RDD+:MLlib+:GraphX+:Nil
def m3[B](x:List[B]):String=x match{
case head+:tail=>s"($head+:${m3(tail)})"
case Nil=>"(Nil)"
}
(Scala+:(Spark+:(DataSet+:(RDD+:(MLlib+:(GraphX+:(Nil)))))))
def m4[B](x: List[B]): String = x match {
case pre :+ end => s"${m4(pre)}:+$end"
case Nil => "Nil"
}
Nil:+Scala:+Spark:+DataSet:+RDD:+MLlib:+GraphX
def m5[B](x: List[B]): String = x match {
case pre :+ end => s"(${m5(pre)}:+$end)"
case Nil => "(Nil)"
}
(((((((Nil):+Scala):+Spark):+DataSet):+RDD):+MLlib):+GraphX)
def windows[A](x: List[A]): String = x match {
case head1+: head2 +: end => s"($head1,$head2)," + windows(x.tail)
case head +: tail => s"($head,_)," + windows(x.tail)
case Nil => "Nil"
}
(Scala,Spark),(Spark,DataSet),(DataSet,RDD),(RDD,MLlib),(MLlib,GraphX),(GraphX,_),Nil
def windows2[A](x: List[A]): String = x match {
case List(head1, head2 , _*) => s"($head1,$head2)," + windows2(x.tail)
case List(head , _*) => s"($head,_)," + windows2(x.tail)
case Nil => "Nil"
}
(Scala,Spark),(Spark,DataSet),(DataSet,RDD),(RDD,MLlib),(MLlib,GraphX),(GraphX,_),Nil
元组的匹配
val ts=Seq(
("Scala","Python","Java"),
("Spark","SparkSQL","MLlib"),
("standalone","YARN","Mesos"),
("HDFS","HBase","S3")
)
for (t<-ts){
val res= t match{
case ("Scala",_,_)=>"Scala!!!"
case (a,b,c) =>s"$a--$b--$c"
}
println(res)
}
guard语句
for (t<-Seq(1,2,3,4,5,6)){
t match{
case _ if t%2==0 =>println("偶数")
case _=>println("奇数")
}
}

浙公网安备 33010602011771号