package spark.examples.scala.grammars.caseclasses
object CaseClass_Test00 {
def simpleMatch(arg: Any) = arg match {
case v: Int => "This is an Int"
case v: (Int, String) => ("This is a (Int, String): " + v._1 + "," + v._2)
case _ => ("Unknown type, print as is: " + _) //模糊匹配,匹配所有的情况,类似*
}
def caseClassMatch(arg: Any) = arg match {
case Dog(_) => arg
case Cat(_) => arg
case Horse(n, a, w) => w
}
def constantMatch(arg: Any) = arg match {
case 3 => "This is an Int 3"
case "3" => "This is a string 3"
case true => "This is boolean true"
case Nil => "This is a Nil"
case null => "This is null"
}
def partialMatch(arg: List[_]) = arg match {
case List(0, _, _) => "This is a list of length 3, and also starts with 0"
case List(0, _*) => "This is a list of length not 3, and starts with 0: " + arg.size
}
def tupleMatch(arg: Any) = arg match {
case (k, v) => "Tuple2: " + k + "," + v
case (k, v, w) => "Tuple3: " + k + "," + v + "," + w
}
def typeMatch(arg: Any) = arg match {
case v: Int => "Int:" + v
case m: Map[_, _] => "Map:" + m.size
case t: (_, _) => "Tuple2: " + t._1 + "," + t._2
case _ => "Unknown type:" + arg
}
def typeEraseMatch(arg: Any) = arg match {
case m: Map[Int, Int] => "Map from Int to Int:" + m.size
case l: List[Int] => "Int List: " + l.size
case t: (String, String) => "String tuple" + t._1
}
def arrayTypeEraseMatch(arg: Any) = arg match {
case ia: Array[Int] => "Int Array: " + ia.length
case sa: Array[String] => "String List: " + sa.length
}
def precedenceMatch(arg: Any) = arg match {
case e: IllegalArgumentException => "This is an IllegalArgumentException"
case e: Exception => "This is an Exception."
}
def optionMatch(arg: Option[_]) = arg match {
case Some(s) => s
case None => "?"
}
//等同于 abstract class Animal { /*empty body*/}
abstract class Animal
//1. 无参的case class已经deprecated
//2. name默认成为case class的val field
//3. 无需new Cat("kitty")
//4.可以copy进行构造一个全新的case class,只有部分属性不同的情况很合适
//5. match/case匹配,match/case class匹配,=>用于分隔模式和模式匹配结果的表达式
//6. match/case匹配,match/case class匹配,case中的属性值,可以使用变量指代或者_指代
//7. case _ => expr,表达的是模糊匹配或者任意匹配
//8.常量匹配
//9. List匹配
//10. Tuple匹配
//11.类型匹配
//12. 集合元素的类型运行时擦除:List,Map,Tuple,不包括数组
//13. 数组元素类型运行时不檫除
//14.匹配优先级,类似switch/case+break
//15. Option
case class Cat(name: String) extends Animal
case class Dog(name: String) extends Animal
case class Horse(name: String, age: Int, weight: Double)
def main(args: Array[String]) {
println(Cat("kitty"))
println(Cat("kitty").name)
println(new Dog("carl"))
val h1 = Horse("H", 8, 121.1)
val h2 = h1.copy(name = "X")
println(h2)
println(simpleMatch(100))
println(simpleMatch(100, "200"))
println(caseClassMatch(Dog("Carl")))
println(caseClassMatch(Horse("H", 11, 222.2)))
//常量匹配
println(constantMatch(3))
println(constantMatch(1 == 1))
println(constantMatch("3"))
println(constantMatch(null))
println(constantMatch(Nil)) //Nil表示空List
//部分匹配
println(partialMatch(List(0, 1, 2)))
println(partialMatch(List(0, 1, 2, 3)))
//元组匹配
println(tupleMatch(1, 2))
println(tupleMatch("One", "Tow", "Three"))
//类型匹配
println(typeMatch(100))
println(typeMatch(Map(1 -> 2, 2 -> 3)))
println(typeMatch(("One", "Two")))
println(typeMatch(("One", "Two", "Three"))) //Unknown type
//类型的运行时擦除:List,Map,Tuple
println(typeEraseMatch(Map(1 -> 1, 2 -> 2))) //匹配m成功
println(typeEraseMatch(Map("One" -> "One", "Two" -> "Two"))) //匹配m成功
println(typeEraseMatch(List(1, 2, 3))) //匹配l成功
println(typeEraseMatch(List("One", "Two", "Three"))) //匹配l成功
println(typeEraseMatch((1, 1))) //匹配t成功
println(typeEraseMatch(("One", "One"))) //匹配t成功
println(arrayTypeEraseMatch(Array(1, 2))) //匹配ia成功
println(arrayTypeEraseMatch(Array("One", "Two"))) //匹配sa成功
println(precedenceMatch(new IllegalArgumentException()))
println(precedenceMatch(new NullPointerException()))
//Option匹配
println(optionMatch(Map("One"->"Two").get("One"))) //Two
println(optionMatch(Map("One"->"Two").get("1"))) //?
}
}
A case class is a simple type of immutable class that comes with implementations of all of the basic Java class methods, like toString, equals, and hashCode, which makes them very easy to use