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)
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模式匹配、样例类】结果:
文章图片
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”
- 洗洗睡了|洗洗睡了 | 休息的时候,千万注意切换你的行为模式