Scala模式匹配、样例类

Scala的模式匹配类似于Java中的switch语法,关键字采用match

  • 1、case _ 相当于java中的default,如果其他case都不满足,会执行case _

  • 2、如果没有匹配到,也没有写case _ ,那么会抛出异常MathError

  • 3、=> 等价于java中的 :

  • 4、=> 到下一个case之间,作为一个整体执行,可以用{}扩起来,也可以不用

  • 5、match支持多个 case _ 但是如果不使用if,那么多个case _ 也没什么意义

  • 6、match是一个表达式,所以它是有返回值的

  • 7、无论什么情况,都只会执行一次或零次case,执行完后,退出match

  • 8、case 后跟if,还需要看if条件是否满足

var a:Int=0
var c=a match {
  case 1 if a <0 => 1
  case 2 => 2
  case _ if a>3 => a+3
  case _ if a>2 => a+2
  case _ => println("没有任何匹配")
}
print(c)

①当a为3的时候,不匹配case1和case2;这时候来到第一个case _ ,由于它后面跟了if,所以它需要判断if条件是否满足,If a> 3不满足,不执行a+3;移动到第二个case _,if a>2 满足,所以执行a+2,结果为5
②当a=1的时候,case 1 满足,但是 a <0 不满足,继续看下一个case,但是后面的条件都不满足,所以会执行 case _ ,输出”没有任何匹配”,并返回()给c,()表示没有返回值

在这里插入图片描述

  • 8、case 后面加变量,相当于把match传进来的值赋予给变量
  • 9、case后面不仅可以值判断,还可以对传进来的值的数据类型进行判断
var a:Any="ac"
var c=a match {
  case 1  => 1
  case 2 => 2
  case i:Double  => a      //传进来的a赋值给i,而且a的类型必须为Double
  case "ac"  => a
  case _ => println("没有任何匹配")
}
print(c)
  • 10、和样例类配合使用
object Test {
   def main(args: Array[String]) {
       val alice = new Person("Alice", 25)
       val bob = new Person("Bob", 32)
       val charlie = new Person("Charlie", 32)
    for (person <- List(alice, bob, charlie)) {
        person match {
            case Person("Alice", 25) => println("Hi Alice!")   //**如果不是样例类,且没有定义unapply方法,这种使用错误**
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   // 样例类
   case class Person(name: String, age: Int)}

结果:
在这里插入图片描述

解释:
①如果传入的参数和case中的样例类的两个属性值一样,那么就代表匹配的上;
②如果case中的样例类没有写具体值,就可以理解成变量,参照第八条
把传入参数的值赋给Person,在后面代码中可以进行取值
③case后的值不全,传入的参数会和已有的值匹配,如果成功,则执行后面代码
假设传入a,首先a的类型要是DogDemo1,然后a的第一个属性值是dog,我这边是name,也就是说a.name=”dog”,这样才算匹配成功

  • 11、匹配数组、集合、元组
def main(args: Array[String]): Unit = {
  val a=Array(1,2,4,5)
  val b=Array(3,4,5)
  val map1=Map("one"->1,"two"->2,"three"->3)
  val tup = (1, "hello", 12)
  val array=Array(b,a,tup,map1)
  var  d:Any=0
  for (elem <- array) {
     d= elem match {
      case Array(_,x,y)=>
        println("3个元素的数组")
        println(x+" "+y)
      case Array(1,_*)=>
        println("1或多个元素,以1开头")
      case (_,x:String,_:Int)=>
        println("3个元素的元组,且第二个元素的类型为String,第三个元素类型为Int")
     case m:Map[_,_]=>
        println("元素类型为map")
      case _ =>
        println("null")
    }
  }
}

结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值