Tuple/case class/模式匹配

2018-02-24 15:59 更新

Tuple為編程提供許多便利

  • 函數(shù)可以通過tuple返回多個值
  • tuple可以存儲在容器類中,代替java bean
  • 可以一次為多個變量賦值

使用tuple的例子

val (one, two) = (1, 2)     
one //res0: Int = 1 
two //res1: Int = 2         
def sellerAndItemId(orderId: Int): (Int, Int) =
   orderId match {  
    case 0 => (1, 2)    
 }          
val (sellerId, itemId) = sellerAndItemId(0)
sellerId // sellerId: Int = 1
itemId // itemId: Int = 2       
val sellerItem = sellerAndItemId(0)
sellerItem._1 //res4: Int = 1
sellerItem._2 //res5: Int = 2

用模式匹配增加tuple可讀性

val sampleList = List((1, 2, 3), (4, 5, 6), (7, 8, 9))
sampleList.map(x => s"${x._1}_${x._2}_${x._3}")
//res0: List[String] = List(1_2_3, 4_5_6, 7_8_9)
sampleList.map {    
  case (orderId, shopId, itemId) =>
    s"${orderId}_${shopId}_$itemId"
}   
//res1: List[String] = List(1_2_3, 4_5_6, 7_8_9)

上下兩個map做了同樣的事情,但下一個map為tuple中的三個值都給了名字,增加了代碼的可讀性.

match和java和switch很像,但有區(qū)別

  1. match是表達式,會返回值
  2. match不需要”break”
  3. 如果沒有任何符合要求的case,match會拋異常,因為是表達式
  4. match可以匹配任何東西,switch只能匹配數(shù)字或字符串常量
//case如果是常量,就在值相等時匹配.
//如果是變量,就匹配任何值.
def describe(x: Any) = x match {
   case 5 => "five" 
   case true => "truth" 
   case "hello" => "hi!"    
   case Nil => "the empty list"
   case somethingElse => "something else " + somethingElse  
}   

case class,tuple以及列表都可以在匹配的同時捕獲內(nèi)部的內(nèi)容.

case class Sample(a:String,b:String,c:String,d:String,e:String)
def showContent(x: Any) =
 x match {      
  case Sample(a,b,c,d,e) => 
  s"Sample $a.$b.$c.$d.$e"  
  case (a,b,c,d,e) =>   
  s"tuple $a,$b,$c,$d,$e"   
  case head::second::rest =>    
  s"list head:$head second:$second rest:$rest"
}

Case class

  1. 模式匹配過程中其實調(diào)用了類的unapply方法
  2. Case class 是為模式匹配(以及其他一些方面)提供了特別的便利的類
  3. Case class 還是普通的class,但是它自動為你實現(xiàn)了apply,unapply,toString等方法
  4. 其實tuple就是泛型的case class
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號