您好,登錄后才能下訂單哦!
這篇文章主要介紹“Scala類型檢查與模式匹配怎么使用”,在日常操作中,相信很多人在Scala類型檢查與模式匹配怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Scala類型檢查與模式匹配怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
要測試某個對象是否屬于某個給定的類,可以用isInstanceOf
方法。如果測試成功,可以用asInstanceOf
方法進行類 型轉換。
if(p.isInstanceOf[Employee]){ //s的類型轉換為Employee val s = p.asInstanceOf[Employee] }
類型轉換主要有下面幾個點要注意的:
如果p指向的是Employee
類及其子類的對象,則p.isInstanceOf[Employee]
將會成功。
如果p是null,則p.isInstanceOf[Employee]
將返回false,且p.asInstanceOf[Employee]
將返回null。
如果p不是一個Employee
,則p.asInstanceOf[Employee]
將拋出異常。
如果想要測試p指向的是一個Employee
對象但又不是其子類,可以用:if(p.getClass == classOf[Employee])
classOf
方法定義在scala.Predef
對象中,因此會被自動引入。不過,與類型檢查和轉換相比,模式匹配通常是更好的選擇。
p match{ //將s作為Employee處理 case s: Employee => ... //p不是Employee的情況 case _ => .... }
Scala 中的模式匹配總結來說支持下面幾種匹配:值匹配,類型匹配,集合元素,元組匹配,有值或者無值匹配,下面從代碼角度來看看這幾種匹配如何使用,首先模式匹配的語法結構如下:
變量 match { case xx => 代碼 }
和Java
的不同點,不需要指定break
,即有break
的效果,使用占位符_
來代表默認值,另外match
和 if
一樣有返回值。
值匹配,即類似Java
中的整型,字符或者,字符串匹配。但是其之處守衛式匹配(可以理解為默認情況下的條件匹配)
//字符匹配 def main(args: Array[String]): Unit = { val charStr = '6' charStr match { case '+' => println("匹配上了加號") case '-' => println("匹配上了減號") case '*' => println("匹配上了乘號") case '/' => println("匹配上了除號") //注意:不滿足以上所有情況,就執行下面的代碼 case _ => println("都沒有匹配上,我是默認值") } } //字符串匹配 def main(args: Array[String]): Unit = { val arr = Array("hadoop", "zookeeper", "spark") val name = arr(Random.nextInt(arr.length)) name match { case "hadoop" => println("大數據分布式存儲和計算框架...") case "zookeeper" => println("大數據分布式協調服務框架...") case "spark" => println("大數據分布式內存計算框架...") case _ => println("我不認識你...") } } //守衛式匹配 def main(args: Array[String]): Unit = { //守衛式 val character = '*' val num = character match { case '+' => 1 case '-' => 2 case _ if character.equals('*') => 3 case _ => 4 } println(character + " " + num) }
類型匹配是相對于Java
來說的優勢點,Java
是做不到的,匹配格式如下:case 變量名:類型
,變量名可以用_
來代替
//類型匹配 def typeMathc (x: Any) = { x match { case _: String => println("字符串") case _: Int => println("整形") case _: Array[Int] => println("正星星數組") case _ => println("nothing") } }
不同于類型匹配的是,類型匹配只能匹配到整個大的類型,而這種匹配可以匹配類似像某類,但是又可以限制匹配類的部分元素
//數組模式匹配 def arrayMatch(x: Array[Int]) = { x match { case Array(1,x,y) => println(x + ":" + y) case Array(1) => println("only 1 ....") case Array(1,_*) => println("1 開頭的") case _ => println("nothing....") } } //list模式匹配 def listMatch() = { val list = List(3, -1) //對List列表進行模式匹配,與Array類似,但是需要使用List特有的::操作符 //構造List列表的兩個基本單位是Nil和::,Nil表示為一個空列表 //tail返回一個除了第一元素之外的其他元素的列表 //分別匹配:帶有指定個數元素的列表、帶有指定元素的列表、以某元素開頭的列表 list match { case x :: y :: Nil => println(s"x: $x y: $y") case 0 :: Nil => println("only 0") case 1 :: _ => println("1 ...") case _ => println("something else") } } //元組匹配 def tupleMatch() = { val tuple = (5, 3, 7) tuple match { case (1, x, y) => println(s"1, $x, $y") case (_, z, 5) => println(z) case _ => println("else") } }
當數組內沒有寫值,下面幾種匹配等效,任意參數等于完全類型匹配
case Array(_*) => println("*") case _: Array[Int] => println("整個數組")
case class樣例類是Scala中特殊的類。當聲明樣例類時,以下事情會自動發生:
主構造函數接收的參數通常不需要顯式使用var或val修飾,Scala會自動使用val修飾
自動為樣例類定義了伴生對象,并提供apply方法,不用new關鍵字就能夠構造出相應的對象
將生成toString、equals、hashCode和copy方法,除非顯示的給出這些方法的定義
繼承了Product和Serializable這兩個特質,也就是說樣例類可序列化和可應用Product的方法
case class是多例的,后面要跟構造參數,case object是單例的。
此外,case class樣例類中可以添加方法和字段,并且可用于模式匹配。怎么理解樣例類的模式匹配呢,在使用動態綁定時候,從樣例類的繼承中可以判斷,某個對象是否屬于某個子類對象,而面向父類的接口,可以簡化編程的設計。跟第一部分說到的isInstanceOf
類似,同時,樣例類可以接受輸入參數進行對應的子類操作。
class Amount //定義樣例類Dollar,繼承Amount父類 case class Dollar(value: Double) extends Amount //定義樣例類Currency,繼承Amount父類 case class Currency(value: Double, unit: String) extends Amount //定義樣例對象Nothing,繼承Amount父類 case object Nothing extends Amount object CaseClassDemo { def main(args: Array[String]): Unit = { judgeIdentity(Dollar(10.0)) judgeIdentity(Currency(20.2,"100")) judgeIdentity(Nothing) } //自定義方法,模式匹配判斷amt類型 def judgeIdentity(amt: Amount): Unit = { amt match { case Dollar(value) => println(s"$value") case Currency(value, unit) => println(s"Oh noes,I got $unit") case _: Currency => println(s"Oh noes,I go") case Nothing => println("Oh,GOD!") } } }
Scala Option
選項類型用來表示一個值是可選的,有值或無值。 Option[T]
是一個類型為 T 的可選值的容器,可以通過get()
函數獲取Option
的值。如果值存在,Option[T]
就是一個 Some
。如果不存在,Option[T]
就是對象 None
。 Option
通常與模式匹配結合使用,用于判斷某個變量是有值還是無值,下面以Map
的自帶返回值Option
來看看這種匹配。
val grades = Map("jacky" -> 90, "tom" -> 80, "jarry" -> 95) def getGrade(name: String): Unit = { val grade: Option[Int] = grades.get(name) grade match { case Some(grade) => println("成績:" + grade) case None => println("沒有此人成績!") } } def main(args: Array[String]): Unit = { getGrade("jacky") getGrade("張三") }
到此,關于“Scala類型檢查與模式匹配怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。