Scala 模式匹配

模式匹配

模式匹配是一个十分强大的机制,可以应用在很多场合: switch语句、类型查询,以及“析构”(获取复杂表达式中的不同部分)。样例类针对模式匹配进行了
优化。

  • 更好的switch
 def match0(x:Int):String = {
    if (x==1){
      "one"
    }else if(x==2){
      "two"
    }else{
      "many"
    }
  }
def match1(x:Int):String=x match{
    case 1=>"one"
    case 2=>"two"
    case 3=>"many"
  }

与 switch语句不同, Scala模式匹配并不会有“意外掉入下一个分支”的问题。(在C和其他类C语言中,你必须在每个分支的末尾显式地使用 break语句来退出
witch,否则将掉入下一个分支。这很烦人,也容易出错。)
同时,你可以用 | 来分隔多个选项,而且,你可以在 match表达式中使用任何类型,而不仅仅是数字。

  • 守卫
    Scala的模式匹配语法,有一个特点在于,可以在case后的条件判断中,不仅仅只是提供一个值,而是可以在值后面再加一个if守卫,进行双重过滤
def studentScore(name:String,score:String): Unit = score match {
      case "A"=>println("excellent")
      case "B"=>println("good")
      case "C"=>println("soso")
      case _ if name=="leo"=>println(name+",you are good boy,come on!")//if守卫
      case _ =>println("you need work harder")
  }

  • 模式中的变量
    如果case关键字后面跟着一个变量名,那么匹配的表达式会被赋值给那个变量。同时对于下划线_这种情况,你可以将case _看作这个特性的一个特殊情况,只不过变量名是罢了,而所有不满足前面case的值,都会进入_这种默认情况进行处理

  • 类型模式
    Scala的模式匹配一个强大之处就在于,可以直接匹配类型,而不是值其他语法与匹配值其实是一样的,
    但是匹配类型的话, 就是要用“case 变量: 类型 => 代码”这种语法,而不是匹配值的“case 值 => 代码”这种语法。

 def match6(e:Exception):Unit = e match {
    case e1:IndexOutOfBoundsException => println("IndexOutofBoundsException")
    case e2:FileNotFoundException => println("FileNotFoundException")
    case e3:NullPointerException => println("NullPointerException")
    case _:Exception => println("Exception")
  }
  • 匹配数组,列表和元组
    对Array进行模式匹配,分别可以匹配带有指定元素的数组、带有指定个数元素的数组、以某元素打头的数组对List进行模式匹配,与Array类似,但是需要使用List特有的::操作符
def match7(arr:Array[String]):Unit = {
    arr match {
      case Array("KB09") => println("hello kb09")
      case Array(girl1,girl2,girl3) => println("hello"+girl1+girl2+girl3)
      case Array("KB09",_*) => println("hello KB09*")
      case _ => println("who are you")
    }
  }
  • 样例类
    样例类是一种特殊的类,它们经过优化以被用于模式匹配。用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对象
 case class Teacher2(name:String,age:Int) extends Person
  case class Student2(name:String,age:Int) extends Person
  case class Worker2(name:String,age:Int) extends Person
  case class msr(name:String,age:Int) extends Person
  def match8(p:Person):Unit = {
    p match {
      case Teacher2("zs",21) => println("zs找到了")
      case Teacher2("zs",age) => println("zs年龄:"+age)
      case p1:Teacher2 => println(p1.name+p1.age)
      case p2:Student2 => println(p2.name+p2.age)
      case p3:Worker2 if p3.name=="repairWorker" => println("修理工")
      case p4:Worker2 => println("普通工人")
      case _ => println("不知道是什么人")
    }
  }
  • Option类型
    Scala有一种特殊的类型,叫做Option。Option有两种值,一种是Some,表示有值,一种是None,表示没有值。Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明
    Option的用法必须掌握,因为Spark源码中大量地使用了Option,比如Some(a)、None这种语法
def match9(name:String):Unit = {
    var score = map.get(name)
    score match {
      case Some(score) => println(name+"的成绩为"+score)
      case None => println("没有"+name+"对应的成绩")
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值