目录
摘要
样本类概念,建立样本类,使用样本类,构造方法与 toString(),模式匹配,模式匹配中的表达式,匹配值,匹配类型,try…catch,匹配样本类
样本类与模式匹配
样本类 Case Class
特点
- 样本类是使用关键字
case
声明的类 - 可以隐式调用构造方法进行初始化
- 样本类默认基于构造方法实现了
toString()
,equals()
和hashCode()
方法,不在构造方法中定义的属性不会产生在toString()
结果中。 - 样本类可以直接使用
==
进行比较,同样不在构造方法中定义的属性不会用在比较上
创建样本类
case class Sum(e1: Expr, e2: Expr) extends Expr {
val comment: String = "comment"
def eval: Int = e1.eval + e2.eval
}
使用样本类
abstract class Expr {
def eval: Int
def calc: Int = this match {
case Number(n) => n
case Sum(e1, e2) => e1.eval + e2.eval
}
}
case class Number(n: Int) extends Expr {
var comment: String = "comment"
def eval: Int = n
}
case class Sum(e1: Expr, e2: Expr) extends Expr {
var comment: String = "comment"
def eval: Int = e1.eval + e2.eval
}
//隐式调用构造方法
val result = Sum(Sum(Number(1), Number(2)), Number(3))
println(result) //Sum(Sum(Number(1),Number(2)),Number(3))
Sum(Number(1), Number(2)) == Sum(Number(1), Number(2))) //true
val num = Number(1)
println(num.n) //1
val sum = Sum(Number(3), Number(4))
println(sum.e1, sum.e2) //(Number(3),Number(4))
println(sum) //Sum(Number(3),Number(4))
模式匹配
特点
- 模式匹配类似
switch
但是功能更加强大 - 模式匹配可以匹配值,类型(包括样本类)
模式匹配中的表达式
模式匹配中可以使用的表达式类型
- 构造器类型,用于进行类型匹配,匹配与此其相似的构造器
- 变量,匹配任何值,且将匹配的值设置到此变量中
- 通配符
_
,匹配任何值
匹配值
val times = 1
val result01 = times match {
case 1 => "one"
case 2 => "two"
case _ => "other"
}
println(result01) //one
val result02 = times match {
case i if i == 1 => "one"
case i if 1 == 2 => "two"
case _ => "other"
}
println(result02) //one
匹配类型
def matchType(o: Any): Any = {
o match {
case i: Int if i <= 0 => i - 1
case i: Int => i + 1
case d: Double if d < 0.0 => d - 0.1
case d: Double => d + 0.1
case str: String => "str is " + str
case _ => "other"
}
}
try…catch 中的模式匹配
def matchTryCatch: Unit = {
try {
throw new NullPointerException
} catch {
case e: NullPointerException => println("null object")
case e: IndexOutOfBoundsException => print("index out of bound")
} finally {
println("finish")
}
}
面向表达式的写法
def matchTryCatchFaceExp: Unit = {
val result: Unit = try {
throw new IndexOutOfBoundsException
} catch {
case e: NullPointerException => println("null object")
case e: IndexOutOfBoundsException => print("index out of bound")
} finally {
println("finish")
}
}
匹配样本类
abstract class Expr {
def eval: Int
def calc: Int = this match {
case Number(n) => n
case Sum(e1, e2) => e1.eval + e2.eval
}
}
case class Number(n: Int) extends Expr {
var comment: String = "comment"
def eval: Int = n
}
case class Sum(e1: Expr, e2: Expr) extends Expr {
var comment: String = "comment"
def eval: Int = e1.eval + e2.eval
}
def eval(e: Expr): Int = e match {
case Number(n) => n
case Sum(l, r) => eval(l) + eval(r)
case x => x.eval * 10
}
println(eval(Sum(Number(1), Number(2)))) //3
println(eval(new Expr {
override def eval: Int = 20
})) //200