必须要掌握的Scala技术点(四)Scala模式匹配和样例类(case class)

4. 模式匹配和样例类

4.1 模式匹配

Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如替代Java中的switch语句、类型检查等。

并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

// 1. 匹配字符串
import scala.util.Random
object Case01 extends App {
  val arr = Array(1, 2, 3)
  val i = arr(Random.nextInt(arr.length))
  i match {
    case 1 => {println(i)}
    case 2 => {println(i)}
//下划线_:代表匹配其他所有类似于switch语句中default
    case _ => {println(i)}
  }
}
// 2. 匹配类型
import scala.util.Random
object Case02 extends App {
  val arr = Array("a", 1, -2.0, Case02)
  val elem = arr(Random.nextInt(arr.length))
  println(elem)
  elem match {
    case x:Int => {println("Int"+x)}
//模式匹配时可以加守卫条件,如果不符合守卫条件,走case_
    case y:Double if(y>=0) => println("Double "+ y)
    case Case02 => {println("Int"+Case02)}
    case _ => {println("default")}
  }
}
// 3. 匹配数组
object Case03 extends App {
  /*  val arr = Array(0, 3, 5)
    arr match {
      case Array(1,x,y) => println(x+":"+y)
      case Array(0) => println("only 0")
        //表示匹配首元素是0的数组
      case Array(0,_*) => println("0 ...")
      case _ => println("else")
    }*/
  /*  val lst = List(0,-1,1,2)
    //head首元素,tail除首元素之外的元素 take从1开始取
    println(lst.head+":"+lst.tail+":"+lst.take(1))
    lst match {
        //首元素0,Nil代表空列表
      case 0 :: Nil => println("only 0")
        //只有两个元素
      case x :: y :: Nil => println(s"x:$x--y:$y")
      case 0 :: x => println(s"0...$x")//head和tail
      case _ => println("else")
    }*/
  val tup = (-1.2, "a", 5)
  tup match {
    //元组有几个元素,case后跟的元组也要有几个元素
    case (1, x, y) => println(s"hello 123 $x , $y")
    case (_, z, 5) => println(z) //前两个元素为任意值
    case _ => println("else")
  }
  val lst1 = 9 :: (5 :: (2 :: Nil))
  val lst2 = 9 :: 5 :: 2 :: List()
  println(lst2+":"+lst1)//952:952
}
4.2 样例类

可用于模式匹配、封装数据(多例)。case class多例,后面跟构造函数;case object是单例的:

import scala.util.Random
case class Task(id:String)
case class HeartTime(private val time:Long)//构造case class可new可不new
case object CheckTimeOut

object Main {
    def main(args: Array[String]) {
        val arr = Array(CheckTimeOut, HeartBeat(88888), Task("0001"))
        val a = arr(Random.nextInt(arr.length))

       a match {
            case Task(id) => {println(s"$id")}//取id值 固定写法
            case HeartTime(time) => {println(s"$time")}
            case CheckTimeOutTask => {
                println("check")
            }
            
            //匹配其他情况
            case _ => prinln("do something")
         }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值