欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java scala模式匹配機(jī)制詳解

 更新時間:2023年02月01日 14:05:07   作者:CarveStone  
模式匹配語法中,采用match關(guān)鍵字聲明,每個分支采用case關(guān)鍵字進(jìn)行聲明,當(dāng)需要匹配時,會從第一個case分支開始,如果匹配成功,那么執(zhí)行對應(yīng)的邏輯代碼,如果匹配不成功,繼續(xù)執(zhí)行下一個分支進(jìn)行判斷

模式匹配

Scala有一個十分強(qiáng)大的模式匹配機(jī)制,可以應(yīng)用在很多場合:switch語句、類型查詢,以及“析構(gòu)”(獲取復(fù)雜表達(dá)式的不同部分)。除此之外,Scala還提供了樣例類,對模式匹配進(jìn)行了優(yōu)化。模式匹配類似于Java中的switch case語法,即對一個值進(jìn)行條件判斷,針對不同的條件進(jìn)行不同的處理。

但是Scala的模式匹配的功能比Java的swtich case語法的功能要強(qiáng)大的多,Java的switch case語法只能對值進(jìn)行匹配。Scala的模式匹配除了可以對值進(jìn)行匹配之外,還可以對類型進(jìn)行匹配、對Array和List的元素情況進(jìn)行匹配、對case class進(jìn)行匹配、甚至對有值或沒值(Option)進(jìn)行匹配。

Scala使用match case語法進(jìn)行模式匹配,語法如下:

變量 match{
    case 值1=> 代碼
    case 值2 => 代碼
    case  _ =>代碼
}

如果值為下劃線,則代表了不滿足以上所有情況下的默認(rèn)情況該如何處理,類似于Java中的default語句

使用類型匹配進(jìn)行異常處理

異常處理是編程任務(wù)當(dāng)中常常需要去解決的問題。簡單來說,異常處理就是在程序運(yùn)行當(dāng)中出現(xiàn)問題時,用來打斷程序執(zhí)行的方式。而Scala當(dāng)中,異常處理的實現(xiàn)與Java類似。

object LearnTypeMatch {
  def matchType(obj:Any): Unit = {
    obj match { //對類的類型進(jìn)行匹配
      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í)行進(jìn)行異常檢測,使用try將這段代碼包起來,在catch語句中進(jìn)行異常的匹配,借用了模式匹配的思想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
  }
}

使用樣例進(jìn)行模式匹配

Scala沒有Java中的switch case,它有一個更加強(qiáng)大的模式匹配機(jī)制,可以應(yīng)用到很多場合。

Scala的模式匹配可以匹配各種情況,比如變量的類型、集合的元素、有值或無值。

模式匹配的基本語法結(jié)構(gòu):

變量 match { case 值 => 代碼 }

模式匹配match case中,只要有一個case分支滿足并處理了,就不會繼續(xù)判斷下一個case分支了,不需要使用break語句。這點與Java不同,Java的switch case需要用break阻止。如果值為下劃線,則代表不滿足以上所有情況的時候如何處理。

模式匹配match case最基本的應(yīng)用,就是對變量的值進(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  //聲明一個類
  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還提供了樣例類,對模式匹配進(jìn)行了優(yōu)化,可以快速進(jìn)行匹配。

到此這篇關(guān)于Java scala模式匹配機(jī)制詳解的文章就介紹到這了,更多相關(guān)Java scala模式匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決SpringMVC接收不到ajaxPOST參數(shù)的問題

    解決SpringMVC接收不到ajaxPOST參數(shù)的問題

    今天小編就為大家分享一篇解決SpringMVC接收不到ajaxPOST參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Java中的CGLIB動態(tài)代理的使用及原理詳解

    Java中的CGLIB動態(tài)代理的使用及原理詳解

    這篇文章主要介紹了Java中的CGLIB動態(tài)代理的使用及原理詳解,CGLIB是一個功能強(qiáng)大,高性能的代碼生成包,它為沒有實現(xiàn)接口的類提供代理,為JDK的動態(tài)代理提供了很好的補(bǔ)充,需要的朋友可以參考下
    2023-09-09
  • Spring?Security權(quán)限控制的實現(xiàn)接口

    Spring?Security權(quán)限控制的實現(xiàn)接口

    這篇文章主要介紹了Spring?Security的很多功能,在這些眾多功能中,我們知道其核心功能其實就是認(rèn)證+授權(quán)。Spring教程之Spring?Security的四種權(quán)限控制方式
    2023-03-03
  • 告訴你springboot各個文件夾的作用

    告訴你springboot各個文件夾的作用

    這篇文章主要介紹了springboot各個文件夾是干嘛的,本文通過截圖實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Android Studio中ButterKnife插件的安裝與使用詳解

    Android Studio中ButterKnife插件的安裝與使用詳解

    本篇文章主要介紹了Android Studio中ButterKnife插件的安裝與使用詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • maven倉庫repositories和mirrors的配置及區(qū)別詳解

    maven倉庫repositories和mirrors的配置及區(qū)別詳解

    這篇文章主要介紹了maven倉庫repositories和mirrors的配置及區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java反射中java.beans包學(xué)習(xí)總結(jié)

    Java反射中java.beans包學(xué)習(xí)總結(jié)

    本篇文章通過學(xué)習(xí)Java反射中java.beans包,吧知識點做了總結(jié),并把相關(guān)內(nèi)容做了關(guān)聯(lián),對此有需要的朋友可以學(xué)習(xí)參考下。
    2018-02-02
  • Spring框架web項目實戰(zhàn)全代碼分享

    Spring框架web項目實戰(zhàn)全代碼分享

    這篇文章主要介紹了Spring框架web項目實戰(zhàn)全代碼分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • springboot?如何解決yml沒有spring的小葉子標(biāo)志問題

    springboot?如何解決yml沒有spring的小葉子標(biāo)志問題

    這篇文章主要介紹了springboot?如何解決yml沒有spring的小葉子標(biāo)志問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springboot默認(rèn)掃描的路徑方式

    springboot默認(rèn)掃描的路徑方式

    這篇文章主要介紹了springboot默認(rèn)掃描的路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論