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