Scala10——Scala模式匹配


Scala是没有Java中的switch case语法的,相对应的,Scala提供了更加强大的match case语法,即模式匹配。
模式匹配包括一系列备选项,每个替代项以关键字大小写为单位。每个替代方案包括一个模式和一个或多个表达式,如果模式匹配,将会进行评估计算。箭头符号=>将模式与表达式分离。
Scala的match case与Java的switch case不同:
Java的switch case仅能匹配变量的值,例如1、2、3等;
Scala的match case可以匹配各种情况,比如变量的类型、集合的元素、有值或无值

1、匹配值

class MatchScore {
  def scoreGrade(grade: String) {
    grade match {
      case "A" => println("优秀")
      case "B" => println("良好")
      case "C" => println("中等")
      case "D" => println("及格")
      case _ => println("你去重考吧")
    }
  }
}

如上,如果case 值为下划线,则代表了不满足以上所有情况下的默认情况,类似于default。
match case中,只要一个case分支满足并处理了,就不会继续下一个case了,不需要像java中需要break。

2、匹配不同数据类型

object Demo {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
   }

   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

其中的值与不同数据类型的模式的数据进行匹配。

3、直接匹配类型

可以直接匹配类型,而不是值。在java中无法直接匹配类型。
格式:case 变量:类型=>匹配后的执行代码语句

object CaseDemo01 extends App{
  val arr = Array("hello", 1, 2.0, CaseDemo)
  val v = arr(Random.nextInt(4))
  println(v)
  v match {
    case x: Int => println("Int " + x)
    case y: Double if(y >= 0) => println("Double "+ y)
    case z: String => println("String " + z)
    case _ => throw new Exception("not match exception")
  }
}

Double if(y >= 0) =>,这里是添加的守卫条件。如果不符合守卫条件,将进入case_中。

4、匹配数组、元组、集合

 val list = List(-1,0,1,2,3)
  list match {
    case 0 :: Nil => println("only 0")
    case x :: y :: Nil => println(s"x: $x y: $y")
    case 0 :: tail => println("0 ...")
    case _ => println("something else")
  }

在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
注意:
:: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

5、样例类

样例类是一种特殊的类,可用于模式匹配.用case class进行声明,有点类似于Java中的JavaBean的概念。
定义形式:
case class 类型,是多例的,后面要跟构造参数。 case class Student(name:String)
case object 类型,是单例的。 case object Person

class MatchPerson {
  
  def personIdentify(p: Person) {
    p match {
      case Teacher(name, subject) => println("Teacher," + name + ", subject:" + subject)
      case Student(name, classGrade) => println("Student,  " + name + ", classGrade :" + classGrade)
      case _ => println("没有证件,不能进校")
    }
  }
}
class Person
case class Teacher(name: String, subject: String) extends Person
case class Student(name: String, classGrade: String) extends Person

6、Option

Scala中,Option类型用样例类来表示可能存在或者可能不存在的值(Option的子类有Some和None)。
Option有两种值,一种是Some,表示有值,一种是None,表示没有值。
Some包装了某个值,None表示没有值.
Spark源码中大量地使用了Option,比如Some(a)、None这种语法

class Grades {

  val grades = Map("xiaoming" -> "A", "xiaohong" -> "B", "xiaogang" -> "C")

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

7、偏函数

被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型。
偏函数常用作输入模式匹配,最大的特点是它只接受和处理: 其参数定义域的一个子集。

object PartialFuncTest  {

  val func1: PartialFunction[String, Int] = {
    case "A" => 1
    case "B" => 2
    case _ => -1
  }

  def func2(num: Int) : Int = num match {
    case 10 => 1000
    case 20 => 0
    case _ => -1
  }

  def main(args: Array[String]) {
    println(func1("c"))
    println(func2(20))
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值