Scala模式匹配

模式匹配是Scala中非常有特色,非常强大的一种功能 。模式匹配,其实类似于Java中的switch case 语法, 即对一个值进行条件判断,然后针对不同的条件,进行不同的处理。

    但是Scala的模式匹配的功能比Java的switch case语法的功能要强大地多,Java的switch case语法只能对值进行匹配。但是scala的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配,对Array和List的元素情况进行匹配、对case class进行匹配 、甚至对有值或没值(Option)进行匹配。

    而且对于Spark来说,Scala的模式匹配功能也是极其重要的,在spark源码中大量地使用了模式匹配功能。
 因此为了更好地编写Scala程序,并且更加通畅地看懂spark的源码,学好模式匹配都是非常重要的


-- 1. 模式匹配的基础语法

Scala提供比Java更加强大的match case语法,即模式匹配,来替代switch case ,match case也称为模式匹配 。

     Scala的match case与Java的switch case最大的不同就在于 Java的switch case仅能匹配变量的值,
     比如 1,2,3等,而Scala 的match case可以匹配各种情况,比如变量的类型、集合的元素、有值或无值

     match case的语法如下:变量match {case 值 => 代码}。 如果值为下划线,则代表了不满足以上所有情况
     下的默认情况如何处理。此外,match case中,只要一个case分支满足并处理了,就不会继续判断下一个
     case分支了。 

     // 案例:成绩评价
     def judgeGrade(grade:String){
     	grade match{
     	   case "A" => println("Excellent")
     	   case "B" => println("Good")
     	   case "C" => println("Just so so")
     	   case _ => println("you need work harder")
     	}
     }

代码展示如下:


-- 2. 在模式匹配中使用if守卫。

 Scala的模式匹配语法,有一个特点在于,可以在case后的条件判断中,不仅仅只是提供一个值,
   而是可以在值后面再加一个if守卫,进行双重过滤。

   //案例:成绩评价(升级版)
   def judgeGrade(name:String , grade:String){
     grade match{
       case "A" => println(name+ " ,you are excellent")
       case "B" => println(name+ " ,you are good")
       case "C" => println(name+ " ,you are just so so")
       case _if name=="leo" => println(name+ " ,you are a good boy ,come on")
       case _ => println("you need to work harder")
     }
   }

代码展示如下:


-- 3. 在模式匹配中进行变量赋值

 Scala的模式匹配语法,有一个特点在于,可以将模式匹配的默认情况,下划线替换为一个变量名,此时模式匹配
   语法就会将要匹配的值赋值给这个变量,从而可以在后面的处理语句中使用要匹配的值。

   为什么会存在这种语法呢? 这是由于我们在写程序时,并不一定知道case的处理语句中匹配的值是什么。
   所以就需要使用这种在模式匹配中进行变量赋值的语法。

   // 案例: 成绩评价(升级版)
   def judgeGread(name:String ,grade :String){
     grade match{
       case "A" => println(name+", you are excellent")
       case "B" => println(name+", you are good")
       case "C" => println(name+",  you are just so so")
       case _grade if name=="leo" =>println(name+", you are a good boy ,come on ,your grade is "+ _grade)
       case _grade => println("you need to work harder ,your grade is "+ _grade)     
     }
   }

代码展示如下:


--  4.  对类型进行模式匹配

Scala的模式匹配一个强大之处就在于,可以直接匹配类型,而不是值, 这是java的switch case 无法做到的。
      理论知识: 对类型如何进行匹配,其他语法与匹配值其实就是一样的,但是匹配类型的话,就是要用"case变
      量:类型=>代码" 这种语法,而不是匹配值的"case值 =>代码"这种语法。


   // 案例:异常处理
   import  java.io._
   def processException(e:Exception){
     e match{
       case e1:IllegalArgumentException =>println("you have illegal arguments! exception is :" +e1)
       case e2:FileNotFoundException =>println("cannot find the file you need read or write! exception is " +e2)
       case e3:IOException => println("you got an error while you were doing IO operation ! exception is "+e3)
       case _:Exception =>println("cannot know which exception you have !")
       
     }
   }

代码展示如下:


-- 5. 对Array和List进行模式匹配

对Array进行模式匹配,分别可以匹配带有指定元素的数组、带有指定个数元素的数组、以某元素打头的数组
   对List进行模式匹配,与Array类似,但是需要使用List特有的:: 操作符。

   // 案例:对朋友打招呼
   def greeting(arr :Array[String]){
     arr match{
       case Array("Leo") =>println("Hi,Leo !")
       case Array(girl1,girl2,girl3) =>println("Hi , girls ,nice to meet you."+girl1+" and "+" and "+girl2+" and "+girl3)
       case Array("Leo",_*) =>println("Hi,Leo ,please introduce your friends to me.")
       case _ => println("hey ,who are you ")       
     }
   }

   def greeting1(list :List[String]){
     list match{
        case "Leo" ::Nil =>println("Hi, leo !")
        case girl1 :: girl2 :: girl3 :: Nil =>println("Hi ,girls ,nice to meet you. " +girl1+" and "+girl2+" and "+girl3)
        case "Leo":: tail => println("Hi, Leo ,please introduce your friends to me")
        case _ => println("hey ,who are you ?")
     }
   }

代码展示如下:

匹配list的方式如下:


-- 6. case class 与模式匹配

Scala提供了一种特殊的类,用case class进行声明,中文也可以称为样例类。case class其实有点类似Java中
 javabean的概念。 即只定义field ,并且由Scala编译时自动提供getter和setter方法。但是没有method。

 case class的主构造函数接收的参数通常不需要使用var或者val修饰,Scala自动回使用val修饰(但是如果我们
 自己使用var修饰,那么还是会按照var来)

 Scala自动为case class定义了伴生对象,也就是object,并且定义了apply()方法 ,该方法接收主构造函数中喜
 相同的参数,并返回case class对象。
   
   // 案例: 学校门禁
   class Person
   case class Teacher(name:String,subject:String) extends Person
   case class Student(name:String ,classroom:String)extends Person

   def judgeIdentify(p:Person){
     p match{
       case Teacher(name,subject) => println("Teacher ,name is " +name +", subject is "+subject)
       case Student(name,classroom) => println("Student , name is "+name+", classroom is" + classroom)
       case _ =>println("Illegal access,please go out of the school")
     }
   }

代码展示如下:


-- 7. Option 与模式匹配

 Scala有一种特殊的类型,叫做Option。 Option有两种值,一种是Some ,一种是None,表示没有值。

  Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁。

  //案例: 成绩查询
  val grades=Map("Leo"-> "A","Jack"->"B","Jen"->"C")

  def getGrade(name:String){
    val grade=grades.get(name)
    grade match{
      case Some(grade) => println("your grade is "+ grade)
      case None => println("Sorry ,your grade information is not in the system")
    }
  }

代码展示如下:


其实模式匹配还有更多的东西还没有写出来,后续接触到了再更新吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值