值匹配
val names = Array("zhangsan","lisi","wangwu")
val name = names(Random.nextInt(names.length))
name match{
case "zhangsan" => {println( "zhangsan")}
case "lisi" => {println( "lisi")}
case "wangwu" => {println("wangwu")}
case _ => {println("没有匹配")}
}
类型匹配
val arr = Array("hello", 1, 2.0)
val v = arr(Random.nextInt(4))
v match {
case x: Int => println("Int " + x)
case y: Double if(y >= 0) => println("Double "+ y)
case z: String => println("String " + z)
case _ => throw new Exception("not match exception")
}
注意:case y: Double if(y >= 0) => ...
模式匹配的时候还可以添加守卫条件。如不符合守卫条件,将掉入case _中
匹配数组,元组
//数组
val arr = Array(1, 3, 5)
arr match {
case Array(1, x, y) => println(x + " " + y)
case Array(0) => println("only 0")
case Array(0, _*) => println("0 ...")
case _ => println("something else")
}
//集合
val lst = List(3, -1)
lst match {
case 0 :: Nil => println("only 0")
case x :: y :: Nil => println(s"x: $x y: $y")
case 0 :: tail => println("0 ...")
case _ => println("something else")
}
//元组
val tup = (2, 3, 5)
tup match {
case (2, x, y) => println(s"1, $x , $y")
case (_, z, 5) => println(z)
case _ => println("else")
}
在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
匹配样例类
val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))
arr(Random.nextInt(arr.length)) match {
case SubmitTask(id, name) => {
println(s"$id, $name")
}
case HeartBeat(time) => {
println(time)
}
case CheckTimeOutTask => {
println("check")
}
}
用case修饰的类就是样例类,样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的
case class 和 class 的一些区别:
1,case class 在初始化的时候,不用 new,而普通类初始化时必须要 new。
2,case class 重写了 toString 方法。 默认实现了 equals 和 hashCode
3,case class 实现了序列化接口 with Serializable
4,case class 支持模式匹配(最重要的特征),所有 case class 必须要有参数列表
5,有参数用 case class,无参用 case object
6,case class,和 case object,可以当作消息进行传递