Scala模式匹配,样例类

值匹配

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,可以当作消息进行传递

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值