首页 > 其他 > 详细

模式匹配

时间:2020-08-14 10:18:56      阅读:50      评论:0      收藏:0      [点我收藏+]
如果所有的case都不匹配,那么执行case_分支,类似于Java中的default
如果所有的case都不匹配,又没有case_分支,则抛出MatchError
每个case都不用break,自动中断case
match中可以使用其他类型,如表达式
=>后面的代码块到下一个case,作为一个整体执行,可以用{}括起来


package chapter04

//如果所有的case都不匹配,那么执行case_分支,类似于Java中的default
//如果所有的case都不匹配,又没有case_分支,则抛出MatchError
//每个case都不用break,自动中断case
//match中可以使用其他类型,如表达式
//=>后面的代码块到下一个case,作为一个整体执行,可以用{}括起来

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

    var oper="#"
    var n1=20
    var n2=10
    var res=0

    oper match{
      case "+" => res = n1 + n2
      case "-" => res= n1 - n2
      case _ => println("oper error")
    }

    println(res) //0

  }

}
package chapter04



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

     //字符串匹配
     for(ch <- "+-3!"){
       var sigh = 0
       var digit = 0
       ch match{
         case ‘+‘ => sigh = 1
         case ‘-‘ => sigh = -1
         case ‘-‘ => sigh = -5 //重复只看第一个匹配的规则
         case _ if ch.toString.equals("3") =>digit = 3
         case _ => sigh = 2  //case_放在最后
       }
       println(ch +" "+sigh+" "+digit)
     }

  }

}
package chapter04


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

     val ch = ‘V‘
     ch match{
       case ‘+‘ => println("ok")
       case mychar => println("ok "+ mychar)
       case _ => println("no")
     }


  }

}
package chapter04


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

    //类型匹配
    //类型匹配时泛型不起作用

    val a =8
    val obj= if(a==1) 1
    else if (a==2) "2"
    else if (a==3) BigInt(3)
    else if (a==4) Map("aa"->1)
    else if (a==5) Map(1->"aa")
    else if (a==6) Array(1,2,3)
    else if (a==7) Array("aa",1)
    else if (a==8) Array("aa")

    val result= obj match{
      case a:Int =>a //1
      case b:Map[String,Int]=>"字符串-数字的Map" //4
      case c:Map[Int,String] =>"数字-字符串的Map" //5
      case d:Array[String]=>"字符串数组" //8
      case e:Array[Int]=>"数字数组" //6
      case f:BigInt=>Int.MaxValue //3
      case _=>"no"  //2 7
    }
    println(result)


  }

}
package chapter04

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

    //数组匹配
    for(arr<- Array(Array(0),Array(1,0),Array(0,1,0),Array(1,1,0))){
      val result=arr match{
        case Array(0)=>"0"
        case Array(x,y)=> x+" "+y
        case Array(0,_*)=>"以0开头"
        case _ =>"no"
      }
      println(result)
    }

    //列表匹配
    for(list<- Array(List(0),List(1,0),List(0,1,0),List(1,1,0))){
      val result=list match{
        case 0::Nil=>"0"
        case x::y::Nil => x+""+y
        case 0::tail=>"0..."
        case _ =>"no"
      }
      println(result)
    }

    //元组匹配
    for (pair<-Array((0,1),(1,0),(2,1),(1,0,2))){
      val result=pair match{
        case (0,_) =>"0...."
        case (y,0)=>y
        case (a,b)=>(b,a)
        case _ =>"no"
      }
      println(result)
    }


  }

}
package chapter04

object test06 {
  def main(args:Array[String]):Unit={
    //对象匹配
    //case中的对象unapply方法(对象提取器),返回Some集合则为匹配成功,返回None,则匹配失败
    object Square{
      def unapply(z:Double):Option[Double]=Some(math.sqrt(z))
      def apply(z:Double):Double=z*z
    }

    val number:Double=36.0
    number match{
      case Square(n)=>println(n)
      case _=>"no"
    }

  }

}
package chapter04

object test07 {
  def main(args:Array[String]):Unit={
    val (username,age,email)=("zhangshan",18,"123.com")
    println(username)
    println(age)
    println(email)


    var (q,r)= BigInt(10)/%3
    println(q)
    println(r)


    val list=List(("a",1),("b",2),("c",3))
    for ((k,v) <- list) {
      println(k+"" +v)

    }
  }

}
package chapter04

object test08 {
  def main(args:Array[String]):Unit={
    //样例类 case class
    val dollar = new Dollar(1.0)
    println(dollar.value)

    //不需要new关键字
    val dollar2 = Dollar(2.0)
    println(dollar2.value)

    for(amt<-Array(Dollar(1000.0),Currency(1000.0,"RMB"),NoAmount)){
      val result = amt match {
        case Dollar(v) => v
        case Currency(v, u) => v + " " + u
        case NoAmount => "NO"


      }
      println(amt+" "+result)

    }
  }

}


abstract sealed class Amount
case class Dollar (value:Double) extends Amount //默认为val
case class Currency(var value:Double,unit:String) extends Amount
case object NoAmount extends Amount

 

模式匹配

原文:https://www.cnblogs.com/hapyygril/p/13500606.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!