大資料系列修煉-Scala課程30

安靜的技術控發表於2016-09-16

大資料系列修煉-Scala課程30


核心內容:
1、模式匹配高階實戰:巢狀的case class


1、模式匹配高階實戰:巢狀的case class

1、在模式匹配中使用巢狀case class的原因:
1>因為我們的case class一般只能表述一個item,在我們進行模式匹配的過程中,當我們想表述某一類item的集合的時候,就需要
巢狀的case class
2、在模式匹配使用巢狀case class的過程中,item:Persion*的含義:
1>item表示Persion型別的成員
2>* 表示Persion型別的成員可以有多個
3、在模式匹配與巢狀的case class結合的過程當中,我們可以使用變數@的方式來引用當前匹配到的物件.


例項程式:

package IT03

//本程式主要是為了測試巢狀的case class和模式匹配的應用

abstract class Item {}  //定義了一個抽象類
case  class Book(description:String,price:Double) extends Item  //定義了一個case class繼承了Item
case  class Bundle(description:String,price:Double,item:Item*) extends Item  //定義了一個case Bundle繼承了Item

//抽象類通常情況下是作為一個類族的最頂層的父類
abstract class Persion{} 
case class Student(age:Int) extends Persion{}   //定義了一個case class 繼承了Persion
case class Worker(age:Int,salary:Double,item:Persion*)  extends Persion //定義了一個case class 繼承了Persion

//本節的知識類似於Java中的多型
object App8
{
    def main(args:Array[String]):Unit=
    {
          def fun1(item:Item) = item match
          {
            case  Book(_,price) => println("price is:" +"\t"+ price)
            case  Bundle(description,price,_*) => println("desc is:" + description + "price is:" + price)
            case _ => println("OK!")
          }

          fun1(Book.apply("spark", 200.0))
          fun1(Bundle.apply("spark",200.0, Book.apply("hadoop", 300.0)))   //在這裡面巢狀了Book型別

          println("--------------------")

          def fun2(persion:Persion) = persion match
          {
             case Student(age) => println("age is:" + age)
             case Worker(age,salary,aa @ Student(_)) => println(aa.age)  //在模式匹配中使用@引用指向一個物件 
          }   

          fun2(Student(20))
          fun2(Worker(20,200.0,Student(40)))
    }  
}

執行結果:

price is:   200.0
desc is:sparkprice is:200.0
--------------------
age is:20
40

相關文章