1蕾盯、匹配模式
Scala有一個十分強大的模式匹配機制幕屹,可以應用到很多場合:如switch語句、類型檢查等级遭。
并且Scala還提供了樣例類望拖,對模式匹配進行了優(yōu)化,可以快速進行匹配
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
}
}
執(zhí)行多次能看到輸出
動漫:命運石之門说敏,動漫:魔法少女小圓,動漫:妖精的旋律
2丢郊、類型匹配
class MatchDemo2 {
val arr = Array(18,"scala",3.14)
val index = arr(Random.nextInt(3))
//進行類型匹配盔沫,case y: Double if(y >= 0) => ...
index match {
//模式匹配的時候還可以添加守衛(wèi)條件。如不符合守衛(wèi)條件枫匾,將掉入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架诞、匹配數(shù)字,List和元祖
class MatchDemo3 {
val arr = Array (1,3,6)
//匹配數(shù)組
arr match {
//匹配三個數(shù)干茉,第一個是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)
//這個也是能匹配到的角虫,但是第一個已經(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")
//只有兩個元素
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) :: 操作符是將給定的頭和尾創(chuàng)建一個新的列表
注意::: 操作符是右結合的戳鹅,如9 :: 5 :: 2 :: Nil相當于 9 :: (5 :: (2 :: Nil))
2搏屑、樣例類
在Scala中樣例類是一中特殊的類,可用于模式匹配粉楚。case class是多例的辣恋,后面要跟構造參數(shù)亮垫,case object是單例的
/**
* 樣例類
* 開頭聲明三個樣例類,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("任務提交成功"),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,而Option有兩種實現(xiàn)一種是case class另一種是case object對應Some(i)和None
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
4逛腿、偏函數(shù)
被包在花括號內(nèi)沒有match的一組case語句是一個偏函數(shù)稀并,它是PartialFunction[A, B]的一個實例,A代表參數(shù)類型单默,B代表返回類型碘举,常用作輸入模式匹配
class PartialFunctionDemo {
//String是參數(shù)類型,Int是返回類型
def parFunc : PartialFunction[String, Int] = {
case "one" => {
print("partial函數(shù)")
1
}
case "two" => {
print("partial函數(shù)")
2
}
case _ => -1
}
def func(str : String): Int = str match {
case "one" => {
print("func函數(shù)")
1
}
case "two" => {
print("func函數(shù)")
2
}
case _ => -1
}
}
object PartialFunctionDemo {
def main(args: Array[String]): Unit = {
val pd = new PartialFunctionDemo
println(pd.parFunc("one"))
println(pd.func("two"))
}
}
輸出
partial函數(shù)1
func函數(shù)2
https://blog.csdn.net/bitcarmanlee/article/details/76736252