1. 程式人生 > >scala中的模式匹配和樣例類

scala中的模式匹配和樣例類

目錄

模式匹配

模式匹配中的守衛和變數

物件模式匹配

陣列模式匹配

 列表模式匹配

元組模式匹配

樣例類(cass class)

匹配巢狀結構

Option的使用

偏函式


模式匹配

模式匹配是scala中的另一個特色,比java中的swich case語句強大的多,不僅能夠對值進行匹配,還可以對型別、集合元素進行匹配。

match case的語法如下:變數 match { case 值 => 程式碼 }。如果值為下劃線,則代表了不滿足以上所有情況下的預設情況如何處理。此外,match case中,只要一個case分支滿足並處理了,就不會繼續判斷下一個case分支了。(與Java不同,java的switch case需要用break阻止)

模式匹配中的守衛和變數

scala中有守衛這麼一個概念,就是對原本的條件,進行二次過濾,在之前的scala條件控制和迴圈 中已經提到過守衛這個概念了。模式匹配中同樣可以在值後面再加一個if守衛,進行雙重過濾。

如果case關鍵字後面跟著一個變數名,那麼匹配的表示式會賦值給這個變數,並且在本條case中可以使用這個變數,“_”可以看做此特性的一種特殊表現形式。

下面介紹一下scala模式匹配的強大用法

物件模式匹配

對型別如何進行匹配?其他語法與匹配值其實是一樣的,但是匹配型別的話,就是要用“case 變數: 型別 => 程式碼”這種語法,而不是匹配值的“case 值 => 程式碼”這種語法。

陣列模式匹配

對Array進行模式匹配,分別可以匹配帶有指定元素的陣列、帶有指定個數元素的陣列、以某元素打頭的陣列

 列表模式匹配

對List進行模式匹配,與Array類似,但是需要使用List特有的::操作符

元組模式匹配

樣例類(cass class)

scala中提供了一種特殊的類,用case class進行宣告,中文也可以稱作樣例類。case class其實有點類似於Java中的JavaBean的概念。即只定義field,並且由Scala編譯時自動提供getter和setter方法,但是沒有method。

case class的主建構函式接收的引數通常不需要使用var或val修飾,Scala自動就會使用val修飾(但是如果你自己使用var修飾,那麼還是會按照var來)。

scala自動為case class定義了伴生物件,也就是object,並且定義了apply()方法,該方法接收主建構函式中相同的引數,並返回case class物件。

我們可以使用copy方法建立一個與現有物件值相同的新物件

雖然這樣做沒什麼意義,因為Student是不可變的,我們完全可以共享這個物件引用,但是我們可以使用帶名引數與copy方法結合修改某些屬性

匹配巢狀結構

有些場景下,樣例類被用於巢狀結構,內部巢狀多個繼承同樣超類的樣例類。例如:超市捆綁銷售

我們也可以用@表示的方法,把巢狀的值繫結到變數上

Option的使用

Scala有一種特殊的型別,叫做Option。Option有兩種值,一種是Some,表示有值,一種是None,表示沒有值。

Option通常會用於模式匹配中,用於判斷某個變數是有值還是沒有值,這比null來的更加簡潔明瞭,也更加安全。

Option支援泛型,比如Some("liumingxin")的型別為Option[String]。

Map的get方法返回的就是一個Option,如果沒有對應的值,分會None

下面做個例子:

這樣寫太繁瑣了,我就是要判斷個值是否存在,你讓我寫這麼多,這個忍不了。下面來用更簡單的方式使用Option

偏函式

偏函式(PartialFunction)是被花括號包含在內的一組case語句,一個並非對所有輸入值都有定義的函式。它時PartialFunction[A,B]類的一個例項(A代表引數型別,B代表輸出型別)。該類又兩個方法,apply方法從匹配到的模式中計算函式值;isDefinedAt方法在輸入至少匹配一個模式時返回true。

偏函式表示式必須位於可以推斷出返回型別的上下文中。當你把它賦值給一個帶有型別宣告的變數,或者將它作為引數傳遞時,都符合要求。