Scala-模式匹配、樣例類锻拘、Option類

1油吭、匹配模式
Scala有一個(gè)十分強(qiáng)大的模式匹配機(jī)制,可以應(yīng)用到很多場(chǎng)合:如switch語(yǔ)句、類型檢查等上鞠。
并且Scala還提供了樣例類际邻,對(duì)模式匹配進(jìn)行了優(yōu)化芯丧,可以快速進(jìn)行匹配
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("命運(yùn)石之門")
    case _ => println("隨機(jī)播放")//相當(dāng)于java的switch中default
  }

  def play(name : String): Unit ={
    println("動(dòng)漫:" + name)
  }

}

object MatchDemo {
  def main(args: Array[String]): Unit = {
    val m = new MatchDemo
  }
}
執(zhí)行多次能看到輸出
動(dòng)漫:命運(yùn)石之門,動(dòng)漫:魔法少女小圓缨恒,動(dòng)漫:妖精的旋律

2谴咸、類型匹配

class MatchDemo2 {

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

  //進(jìn)行類型匹配,case y: Double if(y >= 0) => ...
  index match {
  //模式匹配的時(shí)候還可以添加守衛(wèi)條件骗露。如不符合守衛(wèi)條件岭佳,將掉入case _中
    case i : Int if (i > 15) => println("得到了個(gè)整型:" + i)
    case d : Double => println("得到了個(gè)浮點(diǎn)類型:" + d)
    case s : String => println("得到了個(gè)字符串類型:" + s)
    case _ => println("不知道得了什么類型")
  }

}

object MatchDemo2 {
  def main(args: Array[String]): Unit = {
    val m = new MatchDemo2
  }
}
輸出(只列一個(gè))
得到了個(gè)浮點(diǎn)類型:3.14

3、匹配數(shù)字萧锉,List和元祖

class MatchDemo3 {
  val arr = Array (1,3,6)
  //匹配數(shù)組
  arr match {
      //匹配三個(gè)數(shù)珊随,第一個(gè)是1,后兩個(gè)任意柿隙,匹配時(shí)arr中3,6的值會(huì)賦給x,y
    case Array(1,x,y) => println("arr case1:" + (x + y))
    case Array(2,3,x) => println("arr case2:" + x)
    //這個(gè)也是能匹配到的叶洞,但是第一個(gè)已經(jīng)匹配了就不再匹配后續(xù)
    case Array(1,_*) => throw new Exception("arr case3 匹配不到了")
  }

  val list = List (2,3,7)
  //匹配list
  list match {
    //可以使用匹配數(shù)組的方式
//    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")
    //只有兩個(gè)元素
    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表示空列表)要么是一個(gè)head元素加上一個(gè)tail列表禀崖。
9 :: List(5, 2) :: 操作符是將給定的頭和尾創(chuàng)建一個(gè)新的列表
注意::: 操作符是右結(jié)合的衩辟,如9 :: 5 :: 2 :: Nil相當(dāng)于 9 :: (5 :: (2 :: Nil))

2、樣例類
在Scala中樣例類是一中特殊的類波附,可用于模式匹配艺晴。case class是多例的,后面要跟構(gòu)造參數(shù)掸屡,case object是單例的

/**
  * 樣例類
  * 開(kāi)頭聲明三個(gè)樣例類封寞,case class是多例的,需要傳入?yún)?shù)
  * case object是單例的不能傳入?yún)?shù)
  * 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("任務(wù)提交成功"),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("超時(shí)")
  }
}
object MatchDemo4 {
  def main(args: Array[String]): Unit = {
    val m = new MatchDemo4
  }
}
輸出有三種
超時(shí)仅财,SucceedTask(任務(wù)提交成功)钥星,MySubmitTask(1,wordcount)

3、Option類型
在Scala中Option類型樣例類用來(lái)表示可能存在或也可能不存在的值(Option的子類有Some和None)满着。Some包裝了某個(gè)值谦炒,None表示沒(méi)有值

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")這種方式是會(huì)直接拋出異常的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

    //對(duì)于找不到的元素賦默認(rèn)值的方法,getOrElse找不到c對(duì)應(yīng)的值那么返回默認(rèn)值0
    val c = option.map.getOrElse("c",0)
    println(c)
  }
}
輸出
Some(18)
None
81
0

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

http://www.reibang.com/p/8b5892060858

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市风喇,隨后出現(xiàn)的幾起案子宁改,更是在濱河造成了極大的恐慌,老刑警劉巖魂莫,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件还蹲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谜喊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門潭兽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人斗遏,你說(shuō)我怎么就攤上這事山卦。” “怎么了诵次?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵账蓉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我逾一,道長(zhǎng)铸本,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任遵堵,我火速辦了婚禮箱玷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陌宿。我一直安慰自己锡足,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布限番。 她就那樣靜靜地躺著舱污,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弥虐。 梳的紋絲不亂的頭發(fā)上扩灯,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音霜瘪,去河邊找鬼珠插。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颖对,可吹牛的內(nèi)容都是我干的捻撑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缤底,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顾患!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起个唧,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤江解,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后徙歼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犁河,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳖枕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桨螺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宾符。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灭翔,靈堂內(nèi)的尸體忽然破棺而出魏烫,到底是詐尸還是另有隱情,我是刑警寧澤缠局,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布则奥,位于F島的核電站考润,受9級(jí)特大地震影響狭园,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糊治,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一唱矛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧井辜,春花似錦绎谦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刷允,卻和暖如春冤留,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背树灶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工纤怒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人天通。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓泊窘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親像寒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烘豹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第1條鐵規(guī):公司利益高于一切 公司是全體員工的生存平臺(tái)携悯,個(gè)人利益不能亦不得與之發(fā)生沖突。一旦禍起蕭墻序臂,輕則申斥處罰...
    小義子_正版閱讀 737評(píng)論 0 0
  • 凌哥哥,等等我呀逊彭。 稚嫩的呼喚回蕩在這小弄堂里咸灿,昏黃的燈光下,沈凌一路小跑侮叮。 聽(tīng)到身后的呼喊避矢,他停下了腳步,轉(zhuǎn)過(guò)身...
    天黎琉璃閱讀 988評(píng)論 26 10
  • 勿讓未來(lái)驚擾你囊榜,你終歸抵達(dá)未來(lái)审胸,若你必將抵達(dá),請(qǐng)保持你現(xiàn)金擁有的智慧卸勺。布羅茨基砂沛。
    有翼向北閱讀 50評(píng)論 0 0
  • 畢業(yè)一年多了碍庵,好好壞壞,沉沉浮浮悟狱,也是相繼完成了一些事情静浴,突然想撿起簡(jiǎn)書,繼續(xù)分享我的生活我的工作挤渐。作為局內(nèi)人苹享,更...
    我?guī)煾刚f(shuō)閱讀 550評(píng)論 0 1
  • “努力”這個(gè)詞得问,一直為人們所推崇,甚至有點(diǎn)“走火入魔”白胀,最終會(huì)給人以你只是看起來(lái)很努力地感覺(jué)椭赋,但總有一群人是在腳踏...
    寶藏柒柒閱讀 963評(píng)論 0 6