Scala-模式匹配、样例类、Option类

1、匹配模式
Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。
并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配
1、匹配字符串

/**
  * 匹配模式(match的使用):字符串匹配
  * Created by 12706 on 2017/11/27.
  */
class MatchDemo {

  val arr = Array("a","b","c")
  val index = arr(Random.nextInt(arr.length))

  //字符串匹配 使用matct
  index match {
    case "a"  => play("魔法少女小圆")
    case "b"  => play("妖精的旋律")
    case "c"  => play("命运石之门")
    case _ => println("随机播放")//相当于java的switch中default
  }

  def play(name : String): Unit ={
    println("动漫:" + name)
  }

}

object MatchDemo {
  def main(args: Array[String]): Unit = {
    val m = new MatchDemo
  }
}
执行多次能看到输出
动漫:命运石之门,动漫:魔法少女小圆,动漫:妖精的旋律

2、类型匹配

class MatchDemo2 {

  val arr = Array(18,"scala",3.14)
  val index = arr(Random.nextInt(3))

  //进行类型匹配,case y: Double if(y >= 0) => ...
  index match {
  //模式匹配的时候还可以添加守卫条件。如不符合守卫条件,将掉入case _中
    case i : Int if (i > 15) => println("得到了个整型:" + i)
    case d : Double => println("得到了个浮点类型:" + d)
    case s : String => println("得到了个字符串类型:" + s)
    case _ => println("不知道得了什么类型")
  }

}

object MatchDemo2 {
  def main(args: Array[String]): Unit = {
    val m = new MatchDemo2
  }
}
输出(只列一个)
得到了个浮点类型:3.14

3、匹配数字,List和元祖

class MatchDemo3 {
  val arr = Array (1,3,6)
  //匹配数组
  arr match {
      //匹配三个数,第一个是1,后两个任意,匹配时arr中3,6的值会赋给x,y
    case Array(1,x,y) => println("arr case1:" + (x + y))
    case Array(2,3,x) => println("arr case2:" + x)
    //这个也是能匹配到的,但是第一个已经匹配了就不再匹配后续
    case Array(1,_*) => throw new Exception("arr case3 匹配不到了")
  }

  val list = List (2,3,7)
  //匹配list
  list match {
    //可以使用匹配数组的方式
//    case List(2,3,6) => println("arr case1:" + 236)
//    case List(2,x,y) => println("arr case1:" + (x + y))
    //头是2,后面为空
    case 2 :: Nil => println("只有2")
    //只有两个元素
    case 2 :: 3 :: Nil => println("只有2 3 ")
    //这种输出形式一定要写s
    case 2 :: x :: _ => println(s"x:$x ")
    case 2 :: 3 :: x => println("list:" + x(0))
    case  _ => println("else")
  }

  val tup = (2, 3, 7)
  //匹配元祖
  tup match {
    case (2, x, y) => println(s"2, $x, $y")
    case (_, z, 7) => println(z)
    case  _ => println("else")
  }
}
object MatchDemo3 {
  def main(args: Array[String]): Unit = {
    val m = new MatchDemo3
  }
}
输出
arr case1:9
x:3 
2, 3, 7

注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

2、样例类
在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的

/**
  * 样例类
  * 开头声明三个样例类,case class是多例的,需要传入参数
  * case object是单例的不能传入参数
  * Created by 12706 on 2017/11/27.
  */
case class MySubmitTask(id : Int, name : String)
case class SucceedTask(info : String)
case object TimeOutTask

class MatchDemo4 {
  //样例类可new可不new
  val arr = Array(new MySubmitTask(1,"wordcount"),SucceedTask("任务提交成功"),TimeOutTask)
  var task = arr (Random.nextInt(3))

  //样例类匹配
  task match {
    case MySubmitTask(id,name) => println(s"MySubmitTask($id,$name)")
    case SucceedTask(name) => println(s"SucceedTask($name)")
    case TimeOutTask =>println("超时")
  }
}
object MatchDemo4 {
  def main(args: Array[String]): Unit = {
    val m = new MatchDemo4
  }
}
输出有三种
超时,SucceedTask(任务提交成功),MySubmitTask(1,wordcount)

3、Option类型
在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值

class OptionDemo {
  val map = Map (("a",18),("b",81))
  //get()的返回就是Option
  val a = map.get("a")
  println(a)
  val c = map.get("c")
  println(c)
//  val c2 = map("c")这种方式是会直接抛出异常的NoSuchElementException
  val b = map.get("b") match {
    case Some(x) => println(x)
    case None => println("元素不存在")
  }
}
object OptionDemo {
  def main(args: Array[String]): Unit = {
    val option = new OptionDemo

    //对于找不到的元素赋默认值的方法,getOrElse找不到c对应的值那么返回默认值0
    val c = option.map.getOrElse("c",0)
    println(c)
  }
}
输出
Some(18)
None
81
0

https://blog.csdn.net/bitcarmanlee/article/details/76736252

https://www.jianshu.com/p/8b5892060858

https://my.oschina.net/u/2000675/blog/1592140

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • Sharon1227阅读 296评论 0 0
  • 最近厂里忙着搞建设,到处都是砖头水泥,车多人杂,我的电动车一直都没办法冲洗。 可是,我家住四楼,回到家仍没办法洗车...
    思念红的鱼阅读 163评论 0 0
  • 昨天星期天,在首都图书馆度过的。在图书馆里,看了会书,睡了会觉,敲了会代码。图书馆真是个睡觉的好地方(偷笑)。做了...
    潇洒的风666阅读 45评论 0 0
  • 【 記《哀歌 》】 王小波說一生那麼長,所以記得找個有趣的人過。那不是容貌或外表,而是一個人的內在。 「世界再大,...
    顧然阅读 143评论 0 0
  • 01 同事小娜是公司出了名的“抱怨加嘴碎女王”。我们是同一时间进的公司,记得上班第一天她就在经理和主管面前信誓旦旦...
    见字如面兮阅读 389评论 6 8