Java scala模式匹配機制詳解
模式匹配
Scala有一個十分強大的模式匹配機制,可以應(yīng)用在很多場合:switch語句、類型查詢,以及“析構(gòu)”(獲取復(fù)雜表達式的不同部分)。除此之外,Scala還提供了樣例類,對模式匹配進行了優(yōu)化。模式匹配類似于Java中的switch case語法,即對一個值進行條件判斷,針對不同的條件進行不同的處理。
但是Scala的模式匹配的功能比Java的swtich case語法的功能要強大的多,Java的switch case語法只能對值進行匹配。Scala的模式匹配除了可以對值進行匹配之外,還可以對類型進行匹配、對Array和List的元素情況進行匹配、對case class進行匹配、甚至對有值或沒值(Option)進行匹配。
Scala使用match case語法進行模式匹配,語法如下:
變量 match{
case 值1=> 代碼
case 值2 => 代碼
case _ =>代碼
}
如果值為下劃線,則代表了不滿足以上所有情況下的默認情況該如何處理,類似于Java中的default語句
使用類型匹配進行異常處理
異常處理是編程任務(wù)當(dāng)中常常需要去解決的問題。簡單來說,異常處理就是在程序運行當(dāng)中出現(xiàn)問題時,用來打斷程序執(zhí)行的方式。而Scala當(dāng)中,異常處理的實現(xiàn)與Java類似。
object LearnTypeMatch {
def matchType(obj:Any): Unit = {
obj match { //對類的類型進行匹配
case int:Int => println("Int") //如果obj對象是一個Int型變量,輸出字符串
case string:String => println("String") //如果obj對象是一個String型變量,輸出字符串
case map:Map[_,_] => map.foreach(println) //如果obj對象是一個Map型變量,遍歷這個Map的所有元素
case _ => println("other type") //如果上述類型均無法匹配,則輸出字符串
}
}
def main(args: Array[String]) {
//聲明四種類型的變量
val int = 3
val string = "hello scala"
val map = Map("Alice" -> 10, "Bob" -> 3)
val other = 3.5
//將這四個變量傳遞給matchType函數(shù)
matchType(int)
matchType(string)
matchType(map)
matchType(other)
}
}
如要對一段代碼的執(zhí)行進行異常檢測,使用try將這段代碼包起來,在catch語句中進行異常的匹配,借用了模式匹配的思想catch語句中是一系列的case字句。需要注意的是與try……catch成對出現(xiàn)的還有finally語句-用于執(zhí)行不管是正常處理還是有異常發(fā)生時都需要執(zhí)行的步驟。
object LearnExceptionMatch {
def exceptionMatch(): Unit ={
try{
val i = 10/0 //這行代碼顯然是錯的,在數(shù)學(xué)計算中,0是不能作為除數(shù)的,
println(i)
} catch {
case e:ArithmeticException => println("Divisor cannot be zero") //判斷異常的類型是不是ArithmeticException,如果是輸出字符串
case e:Exception => println(e.getMessage) //如果是其他異常則輸出異常信息
} finally {
println("Hongya Scala") //輸出一句話,由于這句話在finally結(jié)構(gòu)中,因此肯定會執(zhí)行。
}
}
def main(args: Array[String]) {
exceptionMatch
}
}
使用樣例進行模式匹配
Scala沒有Java中的switch case,它有一個更加強大的模式匹配機制,可以應(yīng)用到很多場合。
Scala的模式匹配可以匹配各種情況,比如變量的類型、集合的元素、有值或無值。
模式匹配的基本語法結(jié)構(gòu):
變量 match { case 值 => 代碼 }
模式匹配match case中,只要有一個case分支滿足并處理了,就不會繼續(xù)判斷下一個case分支了,不需要使用break語句。這點與Java不同,Java的switch case需要用break阻止。如果值為下劃線,則代表不滿足以上所有情況的時候如何處理。
模式匹配match case最基本的應(yīng)用,就是對變量的值進行模式匹配。match是表達式,與if表達式一樣,是有返回值的。
object LearnCaseClass {
def caseClassMatch(person:Person): Unit = {
person match {
case CTO(name,floor) => println("CTO name is: " + name + " , floor is: " + floor) //判斷類是否是CTO類
case Employee(name,floor) => println("Employee name is: " + name + " , floor is: " + floor) //判斷類是否為Employee
case _ => println("other") //如果不滿足上面的判斷條件,輸出字符串
}
}
class Person //聲明一個類
case class CTO(name:String, floor:String) extends Person //聲明CTO類
case class Employee(name:String, floor:String) extends Person //聲明Employee類
case class Other(name:String) extends Person //聲明Other類
def main(args: Array[String]) {
//將三個變量帶入
caseClassMatch(CTO("PK", "22"))
caseClassMatch(Employee("Zhang San", "2"))
caseClassMatch(Other("other"))
}
}
除此之外,Scala還提供了樣例類,對模式匹配進行了優(yōu)化,可以快速進行匹配。
到此這篇關(guān)于Java scala模式匹配機制詳解的文章就介紹到這了,更多相關(guān)Java scala模式匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 多線程等待優(yōu)雅的實現(xiàn)方式之Phaser同步屏障
在JAVA 1.7引入了一個新的并發(fā)API:Phaser,一個可重用的同步barrier。在此前,JAVA已經(jīng)有CyclicBarrier、CountDownLatch這兩種同步barrier,但是Phaser更加靈活,而且側(cè)重于 重用2021-11-11
基于Java解決華為機試實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?
這篇文章主要介紹了基于Java解決華為機試實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換,文章舉例說明圍繞文章主題展開相關(guān)內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下2022-02-02
Springboot+Shiro記錄用戶登錄信息并獲取當(dāng)前登錄用戶信息的實現(xiàn)代碼
這篇文章主要介紹了Springboot+Shiro記錄用戶登錄信息,并獲取當(dāng)前登錄用戶信息,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
5分鐘讓你快速掌握java8 stream常用開發(fā)技巧
這篇文章主要給大家介紹了關(guān)于java8 stream常用開發(fā)技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Mybatis-Plus根據(jù)自定義注解實現(xiàn)自動加解密的示例代碼
我們把數(shù)據(jù)存到數(shù)據(jù)庫的時候,有些敏感字段是需要加密的,從數(shù)據(jù)庫查出來再進行解密,如果我們使用的是Mybatis框架,那就跟著一起探索下如何使用框架的攔截器功能實現(xiàn)自動加解密吧,需要的朋友可以參考下2024-06-06
Jmeter解析返回參數(shù)以及解析并操作json方式
本文總結(jié)了Java或JMeter的BeanShell腳本中處理JSON字符串的常用操作,包括解析JSON數(shù)組、JSON對象和嵌套的JSON字符串,并提供了示例代碼和打印結(jié)果2025-02-02

