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

 

posted @ 2015-03-08 12:28  智能先行者  阅读(1699)  评论(0)    收藏  举报