本章要点
- match
- case 类
scala有一个强大的模式匹配机制,可以应用在很多场合:switch语句、类型检查,以及“析构”(获取复杂表达式中的不同部分)。
scala还提供样例类
15.1 match
class Test{
}
object Test{
def main(args: Array[String]): Unit = {
val sex:String="1";
def manDesc(sex:String):String=sex match {
case "nv" =>"漂亮"
case "nan" =>"帅气"
case _=>"不男不女"
}
println(manDesc(sex));
}
}
与default 效果类似的是 case _,无匹配的时候执行case _语句。
注意: case后面没有break语句,并且match后边表达式中可以使用任何类型。
类型匹配:
class Test{
}
object Test{
def main(args: Array[String]): Unit = {
def matchType(obj:Any)=obj match{
case x:Integer => x+10;
case s:String=>"hello"+s;
case _ => 0;
}
println(matchType(Int))
}
}
变量匹配
class Test {
}
object Test {
def main(args: Array[String]): Unit = {
def abs(x: Int) = x match {
case x if (x > 0) => x
case x if (x < 0) => -x
}
}
}
构造匹配
case class User(name: String, password: String)
class Test {
}
object Test {
def main(args: Array[String]): Unit = {
val user = new User("zhaosc", "1234")
def constructor(u: User) = user match {
//构造器模式必须将User类定义为case class,否则需要自己定义伴生对象并实现unapply方法。
case User(name, password) => "name =" + name + ",password =" + password
case _ => "Other"
}
println(constructor(user))
}
}
15.2 样例类
- 概念理解
使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类,他们经过优化以被用于模式匹配。
- 样例类构造器中的每一个参数,都是val的;实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,它将帮你实现setter和getter方法。
- 样例类默认帮你实现了toString,equals,copy和hashCode等方法。
- 样例类可以new, 也可以不用new
case class User(name: String, password: String)