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("奇数") } }