操做付默認左結合調用.除了以:結尾的操做符是右結合調用java
object OperaterTest extends App{ val a: myInt = new myInt(1) val b: myInt = new myInt(2) val c: myInt = new myInt(3) println(a +++ b) println((c---:b---:a).value) //:結尾的操做符右結合,至關於(a.---:(b)).---:(c) = 1-2-3 } class myInt(val value:Int){ def +++(a:myInt):Int = { // 定義操做符 +++ a.value + value // 要使a.value可以訪問,主構造器的字段要生命成val.使getter,setter方法爲public } // 操做符默認左結合,除了以:結尾的操做符使o結合的右.好比:: def ---:(a:myInt):myInt = { new myInt(this.value - a.value) } }
scala object Test extends App{ val scores = new mutable.HashMap[String,Int] scores("Bob") = 100 // update println(scores("Bob")) // apply }
unapply方法
(1)當用未初始化的變量放在一個類()裏,和等式右側的對象進行匹配時,則這些未初始化的變量調用該類的unapply方法進行初始化
(2)unapply()方法返回的結果使Option[元祖]類型的,要麼是None,要麼是Some[T]c++
object CaseClassTest extends App{ val Name(first,scend,third) = "haha hehe lala"; // first,second,third必須是未聲明的變量 println(first) println(scend) println(third) } object Name{ def unapply(input:String) :Option[(String,String,String)] = { //元祖:不一樣類型的值的集合 if(input.indexOf(" ") == -1) None else Some(input.split(" ")(0),input.split(" ")(1),input.split(" ")(2)) } }
unapplySeq方法
(1)unapply用來提取固定個數的變量,來給未知變量賦值.若要提取出不定長度的變量,用unapplySeq方法
(2)unapplySeq與unapply不能同事存在,不然模式匹配時,只會調用unapply進行匹配app
object CaseClassTest extends App{ val Name(first,scend,third) = "haha hehe lala"; // first,second,third必須是未聲明的變量 println(first) println(scend) println(third) val str = "asd sdf gh sdf" str match { case Name(a,b,c) => println("3 param:"+a+","+b+","+c) case Name(a,b,c,d) => println("4 param:"+a+","+b+","+c+","+d) } } object Name{ def unapplySeq(input:String):Option[Seq[String]] ={ if(input.indexOf(" ") == -1) None else Some(input.split(" ")) } }
什麼事樣例類:通過scala編譯器優化後,被更好的用於模式匹配規則的類
(1)Case class的每一個參數默認以val(不變形式)存在,除非顯式的聲明爲var
(2)自動產生伴生對象,、且半生對象中自動產生appay方法來構建對象
(3)半生對象自動產生unapply方法,提取主構造器的參數進行模式匹配
(4)自動產生copy方法,來構建一個與現有值相同的新對象
(5)class中自動產生hashcode,toString,equals方法優化
object CaseClassTest extends App{ val currency:Money = RMB(12.3,"yuan") //多態下,子類的模式匹配 currency match { case Dollar(x:Double) => println("dollar:"+x) case RMB(x:Double,y:String) => println("rmb:"+x+y) //rmb:12.3yuan } val currency2 = RMB(23.4,"yuan") println(currency2.copy(value=12.1)) //RMB(12.1,yuan) =>自動產生的toString } abstract class Money case class Dollar(value:Double) extends Money case class RMB(value:Double,danwei:String) extends Money
匹配循環嵌套的樣例類
(1)循環嵌套的樣例類:一個case class的對象中,包含另外一個case class的對象實例
(2)由於對象存在循環嵌套,則須要使用遞歸處理對象,切該對象要有別名,用於遞歸處理。name @ patternthis
object CaseClassTest extends App{ val bundle:Item = Bundle("Father's day special",20.0, // 這個對象包含2個Item,1個是artice,另外一個是包含兩個artice的Bundle Article("scala for impatient",39.3), Bundle("other lanugage",10.0,Article("thinking in java",79.5),Article("c++ progeamme",65.4))) def price(it:Item):Double= it match { case Article(_,price) => price case Bundle(_,disc,items @ _*) => items.map(price(_)).sum - disc } println(price(bundle)) } abstract class Item case class Article(description:String,price:Double) extends Item case class Bundle(description:String,discount:Double,iterms:Item*) extends Item
case class的密封
(1)當case class的超類使用關鍵字sealed修飾,則編譯器會校驗對該超類對象的模式匹配規則中,是否列出了所有可能的子case類
(2)且該超類的子類只能出如今超類的文件中,造成封閉,而不能出如今其餘文件中scala