天天看點

Scala入門到精通——第十四節 Case Class與模式比對(一)

模式比對入門

case class簡介

case class進階

在java語言中存在switch語句,例如:

scala解決了java語言中存在的這個問題,scala解決這一問題的利器就是模式比對,上面的java代碼可以利用scala語言的模式比對來避免,代碼如下:

上述scala代碼展示了如何使用scala中的模式比對,它的實作方式是通過match關鍵字與 case x=>的方式實作的,其中case _表示除了 case 10,case 50,case 80的其餘比對,類似于java中的default。但scala語言中提供了更為靈活的比對方式,如:

case語言中還可以加相應的表達式,例如:

case class一般被翻譯成樣例類,它是一種特殊的類,能夠被優化以用于模式比對,下面的代碼定義了一個樣例類:

當一個類被聲名為case class的時候,scala會幫助我們做下面幾件事情:

1 構造器中的參數如果不被聲明為var的話,它預設的話是val類型的,但一般不推薦将構造器中的參數聲明為var

2 自動建立伴生對象,同時在裡面給我們實作子apply方法,使得我們在使用的時候可以不直接顯示地new對象

3 伴生對象中同樣會幫我們實作unapply方法,進而可以将case class應用于模式比對,關于unapply方法我們在後面的“提取器”那一節會重點講解

4 實作自己的tostring、hashcode、copy、equals方法

除此之此,case class與其它普通的scala類沒有差別

下面給出case class student位元組碼檔案内容,以驗證我們上述所講的内容:

1 case class常用方法

前面我們提到,定義case class便會自動生成對應的tostring,hashcode,equals,copy等方法,

2 多個參數的case class

3 sealed case class

在進行模式比對的時候,有些時候需要確定所有的可能情況都被列出,此時常常會将case class的超類定義為sealed(密封的) case class,如:

編譯器給出的提示可以通過下列語句進行消除,

4 case class在實用應用中的其它用途

某個類一旦被定義為case class,則編譯器會自動生成該類的伴生對象,伴生對象中包括了apply方法及unapply方法,apply方法使得我們可以不需要new關鍵字就可以建立對象,而unapply方法,則使得可以友善地應用在模式比對當中,另外編譯器還自動地幫我們實作對應的tostring、equals、copy等方法。在實際中,case class除了在模式比對時能發揮其強大的威力之外,在進行其它應用時,也顯示出了其強大的功能,下面給出case class在sparksql中的應用,旨在說明case class在實際應用中的重要地位。

添加公衆微信号,可以了解更多最新spark、scala相關技術資訊

Scala入門到精通——第十四節 Case Class與模式比對(一)