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,()表示没有返回值
Scala模式匹配、样例类
文章图片

  • 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)}

结果:
Scala模式匹配、样例类
文章图片

解释:
①如果传入的参数和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) vard: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") } } }

【Scala模式匹配、样例类】结果:
Scala模式匹配、样例类
文章图片

    推荐阅读