Scala模式匹配说明和使用

Scala模式匹配说明和使用

在Scala中没有swich case 的语法结构,取而代之的是match case的语法,在Scala中被称为模式匹配,相较于switch的分支结构,match的功能就要强大许多了。它不仅可以匹配整形和字符还能匹配类相关的复杂数据结构。

匹配数值、字符以及字符串

object MatchOpsValue{
  def main(args: Array[String]): Unit = {
    matchTest(1)
    matchTest("two")
    matchTest('a')
    matchTest(8)
    yiledOps
  }
  def matchTest(x: Any):Any = x match{
    case 1=>println(s"${x} is Scala.Int")
    case "two"=>println(s"${x} is Scala.String")
    case 'a'=>println(s"${x} is Scala.Char")
    case _=>println(s"${x} is Scala.Any")
  }
  def yiledOps: Unit ={
    println("后台输入一个字符:")
    val ch=StdIn.readChar()
    val sign = ch match{
      case '+' => -1
      case '-' => 1
      case _ => 0
    }
    println (sign)
  }
}

这里要注意match是一段代码块,代码块是有返回值的,所以可以用match进行赋值。

匹配类型

类型匹配是对类型检查和类型转化的简化,可以使用在多子类的操作中。

object MatchOpsClass {
  def main(args: Array[String]): Unit = {
    typeOps
  }
  def typeOps: Unit ={
    class Person(name:String, age:Int){}
    class Worker(name:String, age:Int) extends Person(name,age){
      def work(): Unit ={
        println(s"${name} 年龄${age}欺负一个60多岁的老同志,这不好!")
      }
    }
    class OldMan(name:String, age:Int)extends Person(name,age){
      def stand(): Unit ={
        println(s"${name} ${age}的老同志啪一下就站起来了,很快啊!")
      }
    }
    def doth(someOne:Person): Unit =
    {
      someOne match {
        case worker:Worker => worker.work()
        case oldman:OldMan => oldman.stand()
      }
    }
    doth(new OldMan("马",80))
  }
}

匹配集合

匹配集合的使用比较特殊。

object MatchOpsCollection {
  def main(args: Array[String]): Unit = {
    collectionOps

  }
  def collectionOps: Unit ={
    val arr:Array[Int]=Array(0,1,3)
    arr match{
        /*匹配是否是三个元素并赋值*/
      case Array(x,y,z) => println(s"${x},${y},${z}")
      /*匹配是首元素为0的数组*/
      case Array(0,_*) => println("数组以0开头")
      case _ =>println("未能匹配")
    }
  }
}

匹配样例类

Scala样例类的说明和使用

object MatchOpsCaseClass {
  def main(args: Array[String]): Unit = {
    caseops
  }
  def caseops: Unit ={
    abstract class Expr
    case class Var(name:String) extends Expr
    case class UnOp(expr: Expr,operation:String) extends Expr
    case class Number(num: Double) extends Expr
    case class BinOp(left:Expr, operation:String, right:Expr) extends Expr
    def test(exp:Expr): Unit =
    {
      exp match {
        case Var(name)=>println(s"var:${name}")
        case UnOp(Var(name),"+") =>println(s"var:${name}++")
        case BinOp(Number(num1),"+",Number(num2))=>println(num1+num2)
        case _=>println("Nothing matched!")
      }
    }
    test(BinOp(Number(2.0),"+",Number(3.0)))
  }
}

匹配Option

Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。
Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。

object MatchOpsOption {
  def main(args: Array[String]): Unit = {
    optiontest
  }
  def optiontest: Unit ={
    val numMap:Map[Int,String]=Map(1->"3",2->"5",3->"7")
    println(numMap.get(9)+show(numMap.get(9)))

    def show(x:Option[String]): String = x match{
      case Some(s) =>s
      case None => "?"
      }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值