如果一个case class 其构造函数的参数又是另一个case class,那么我们如果使用模式匹配呢?
请看下面的例子
package com.dt.scala.pattern_match
abstract class Item
case class Book(Description: String,Price: Double) extends Item
case class Bundle(Description: String,Price: Double,item: Item*) extends Item
object CaseClassNested {
def main(args: Array[String]): Unit = {
def caseClaseNestedMatch(item: Item) = item match {
case Bundle(x,y,Book(desc,price)) => {
println("Bundle‘s description:"+x)
println("Bundle‘s price:"+y)
println("Bundle‘s Book description:"+desc)
}
case Bundle(x,y,first @Book(_,_),rest @ _*) => {
println("Bundle‘s description:"+x)
println("Bundle‘s price:"+y)
println("Bundle‘s first Book description:"+first.Description)
}
}
caseClaseNestedMatch(Bundle("one book",49,Book("Spark in action",49)))
caseClaseNestedMatch(Bundle("two book",100,Book("Hadoop in action",50),Book("Spark",50)))
}
}Book是一个case class 而Bundle的参数也可以有多个Book类 。
如果想匹配Book内的参数,可以使用类似Book(x,y)来进行模式匹配。如果想匹配整个Book类,那么使用first @ Book(_,_) 来匹配。first是常量名称,可以随意定义。@ 后面是类的名称。
本文出自 “叮咚” 博客,请务必保留此出处http://lqding.blog.51cto.com/9123978/1741944
原文:http://lqding.blog.51cto.com/9123978/1741944