欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Scala模式匹配

程序员文章站 2022-06-06 22:35:51
...

模式匹配是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")
     	}
     }

代码展示如下:

Scala模式匹配

-- 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")
     }
   }

代码展示如下:

Scala模式匹配

-- 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)     
     }
   }

代码展示如下:

Scala模式匹配

--  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 !")
       
     }
   }

代码展示如下:

Scala模式匹配

-- 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 ?")
     }
   }

代码展示如下:

Scala模式匹配

匹配list的方式如下:

Scala模式匹配

-- 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")
     }
   }

代码展示如下:

Scala模式匹配

-- 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")
    }
  }

代码展示如下:

Scala模式匹配

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