Java scala模式匹配機(jī)制詳解
模式匹配
Scala有一個(gè)十分強(qiáng)大的模式匹配機(jī)制,可以應(yīng)用在很多場(chǎng)合:switch語(yǔ)句、類型查詢,以及“析構(gòu)”(獲取復(fù)雜表達(dá)式的不同部分)。除此之外,Scala還提供了樣例類,對(duì)模式匹配進(jìn)行了優(yōu)化。模式匹配類似于Java中的switch case語(yǔ)法,即對(duì)一個(gè)值進(jìn)行條件判斷,針對(duì)不同的條件進(jìn)行不同的處理。
但是Scala的模式匹配的功能比Java的swtich case語(yǔ)法的功能要強(qiáng)大的多,Java的switch case語(yǔ)法只能對(duì)值進(jìn)行匹配。Scala的模式匹配除了可以對(duì)值進(jìn)行匹配之外,還可以對(duì)類型進(jìn)行匹配、對(duì)Array和List的元素情況進(jìn)行匹配、對(duì)case class進(jìn)行匹配、甚至對(duì)有值或沒(méi)值(Option)進(jìn)行匹配。
Scala使用match case
語(yǔ)法進(jìn)行模式匹配,語(yǔ)法如下:
變量 match{
case 值1=> 代碼
case 值2 => 代碼
case _ =>代碼
}
如果值為下劃線,則代表了不滿足以上所有情況下的默認(rèn)情況該如何處理,類似于Java中的default語(yǔ)句
使用類型匹配進(jìn)行異常處理
異常處理是編程任務(wù)當(dāng)中常常需要去解決的問(wèn)題。簡(jiǎn)單來(lái)說(shuō),異常處理就是在程序運(yùn)行當(dāng)中出現(xiàn)問(wèn)題時(shí),用來(lái)打斷程序執(zhí)行的方式。而Scala當(dāng)中,異常處理的實(shí)現(xiàn)與Java類似。
object LearnTypeMatch { def matchType(obj:Any): Unit = { obj match { //對(duì)類的類型進(jìn)行匹配 case int:Int => println("Int") //如果obj對(duì)象是一個(gè)Int型變量,輸出字符串 case string:String => println("String") //如果obj對(duì)象是一個(gè)String型變量,輸出字符串 case map:Map[_,_] => map.foreach(println) //如果obj對(duì)象是一個(gè)Map型變量,遍歷這個(gè)Map的所有元素 case _ => println("other type") //如果上述類型均無(wú)法匹配,則輸出字符串 } } def main(args: Array[String]) { //聲明四種類型的變量 val int = 3 val string = "hello scala" val map = Map("Alice" -> 10, "Bob" -> 3) val other = 3.5 //將這四個(gè)變量傳遞給matchType函數(shù) matchType(int) matchType(string) matchType(map) matchType(other) } }
如要對(duì)一段代碼的執(zhí)行進(jìn)行異常檢測(cè),使用try將這段代碼包起來(lái),在catch語(yǔ)句中進(jìn)行異常的匹配,借用了模式匹配的思想catch語(yǔ)句中是一系列的case字句。需要注意的是與try……catch成對(duì)出現(xiàn)的還有finally語(yǔ)句-用于執(zhí)行不管是正常處理還是有異常發(fā)生時(shí)都需要執(zhí)行的步驟。
object LearnExceptionMatch { def exceptionMatch(): Unit ={ try{ val i = 10/0 //這行代碼顯然是錯(cuò)的,在數(shù)學(xué)計(jì)算中,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)中,因此肯定會(huì)執(zhí)行。 } } def main(args: Array[String]) { exceptionMatch } }
使用樣例進(jìn)行模式匹配
Scala沒(méi)有Java中的switch case,它有一個(gè)更加強(qiáng)大的模式匹配機(jī)制,可以應(yīng)用到很多場(chǎng)合。
Scala的模式匹配可以匹配各種情況,比如變量的類型、集合的元素、有值或無(wú)值。
模式匹配的基本語(yǔ)法結(jié)構(gòu):
變量 match { case 值 => 代碼 }
模式匹配match case中,只要有一個(gè)case分支滿足并處理了,就不會(huì)繼續(xù)判斷下一個(gè)case分支了,不需要使用break語(yǔ)句。這點(diǎn)與Java不同,Java的switch case需要用break阻止。如果值為下劃線,則代表不滿足以上所有情況的時(shí)候如何處理。
模式匹配match case最基本的應(yīng)用,就是對(duì)變量的值進(jìn)行模式匹配。match是表達(dá)式,與if表達(dá)式一樣,是有返回值的。
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 //聲明一個(gè)類 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]) { //將三個(gè)變量帶入 caseClassMatch(CTO("PK", "22")) caseClassMatch(Employee("Zhang San", "2")) caseClassMatch(Other("other")) } }
除此之外,Scala還提供了樣例類,對(duì)模式匹配進(jìn)行了優(yōu)化,可以快速進(jìn)行匹配。
到此這篇關(guān)于Java scala模式匹配機(jī)制詳解的文章就介紹到這了,更多相關(guān)Java scala模式匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringMVC接收不到ajaxPOST參數(shù)的問(wèn)題
今天小編就為大家分享一篇解決SpringMVC接收不到ajaxPOST參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Java中的CGLIB動(dòng)態(tài)代理的使用及原理詳解
這篇文章主要介紹了Java中的CGLIB動(dòng)態(tài)代理的使用及原理詳解,CGLIB是一個(gè)功能強(qiáng)大,高性能的代碼生成包,它為沒(méi)有實(shí)現(xiàn)接口的類提供代理,為JDK的動(dòng)態(tài)代理提供了很好的補(bǔ)充,需要的朋友可以參考下2023-09-09Spring?Security權(quán)限控制的實(shí)現(xiàn)接口
這篇文章主要介紹了Spring?Security的很多功能,在這些眾多功能中,我們知道其核心功能其實(shí)就是認(rèn)證+授權(quán)。Spring教程之Spring?Security的四種權(quán)限控制方式2023-03-03Android Studio中ButterKnife插件的安裝與使用詳解
本篇文章主要介紹了Android Studio中ButterKnife插件的安裝與使用詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01maven倉(cāng)庫(kù)repositories和mirrors的配置及區(qū)別詳解
這篇文章主要介紹了maven倉(cāng)庫(kù)repositories和mirrors的配置及區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java反射中java.beans包學(xué)習(xí)總結(jié)
本篇文章通過(guò)學(xué)習(xí)Java反射中java.beans包,吧知識(shí)點(diǎn)做了總結(jié),并把相關(guān)內(nèi)容做了關(guān)聯(lián),對(duì)此有需要的朋友可以學(xué)習(xí)參考下。2018-02-02Spring框架web項(xiàng)目實(shí)戰(zhàn)全代碼分享
這篇文章主要介紹了Spring框架web項(xiàng)目實(shí)戰(zhàn)全代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11springboot?如何解決yml沒(méi)有spring的小葉子標(biāo)志問(wèn)題
這篇文章主要介紹了springboot?如何解決yml沒(méi)有spring的小葉子標(biāo)志問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03