第七章 scala语言–case_class
前言
今天是学习Scala第七天打卡,开始学习Scala高级用法-case_class。
以case class示例做一些些探讨:
代码如下(示例):
case class Person(salaryList: List[Double]=List(0.0),monthList:List[(Int,Int)]=List((-1,1)))
当你声明一个case class时,scala编译器做了这些事情:
1、创建case class和它的伴生object
2、创建apply方法,让你不需要通过new来创建类实例
代码如下(示例):
case class Person(salaryList: List[Double]=List(0.0),monthList:List[(Int,Int)]=List((-1,1)))
object Lesson05_case_class {
def main(args: Array[String]): Unit = {
var a = List(1000.0)
var b = List((1,3))
val p1 = Person(a,b)
println(p1)
}
}
执行结果:
---------------------------------------------------------------------------------------------------------------------------
Person(List(1000.0),List((1,3)))
3、默认为主构造函数参数列表的所有参数前加val
代码如下(示例):
case class Person(salaryList: List[Double]=List(0.0),monthList:List[(Int,Int)]=List((-1,1)))
object Lesson05_case_class {
def main(args: Array[String]): Unit = {
var a = List(1000.0)
var b = List((1,3))
val p1 = Person(a,b)
p1.salaryList = List(2000.0)
println(p1)
}
}
执行结果:
---------------------------------------------------------------------------------------------------------------------------
Error:(13, 19) reassignment to val
p1.salaryList = List(2000.0)
4、添加天然的hashcode、equals和toString方法。由于==在scala中总等于equal,所以case class实例总是可以比较的
代码如下(示例):
case class Person(salaryList: List[Double]=List(0.0),monthList:List[(Int,Int)]=List((-1,1)))
object Lesson05_case_class {
def main(args: Array[String]): Unit = {
var a = List(1000.0)
var b = List((1,3))
val p1 = Person(a,b)
println(p1.equals(p2))
println(p1 == p2)
}
}
执行结果:
---------------------------------------------------------------------------------------------------------------------------
true
true
5、生成一个copy方法以支持从实例a生成另一个实例b,实例b可以指定构造函数参数与实例a一致或者不一致
代码如下(示例):
case class Person(salaryList: List[Double]=List(0.0),monthList:List[(Int,Int)]=List((-1,1)))
object Lesson05_case_class {
def main(args: Array[String]): Unit = {
var a = List(1000.0)
var b = List((1,3))
val p1 = Person(a,b)
val p3 = p1.copy(salaryList = List(6000.0))
val p4 = p1.copy(monthList = List((2,5)));
println(p3)
println(p4)
}
}
执行结果:
---------------------------------------------------------------------------------------------------------------------------
Person(List(6000.0),List((1,3)))
Person(List(1000.0),List((2,5)))
6、结合unapply方法,case class的功能
(1)由于编译器实现的unapply方法,一个case class支持模式匹配
代码如下(示例):
case class A(a:Int)
case class B(b:String)
object Lesson05_case_class001 {
def classMatch(x:AnyRef):Unit = {
x match {
case A(a) => println("A:"+a)
case B(b) => println("B:"+b)
case A => println(A.apply(100))
}
}
def main(args: Array[String]): Unit = {
var a = A(1)
var b = B("b")
classMatch(a)
classMatch(b)
}
}
执行结果:
---------------------------------------------------------------------------------------------------------------------------
A:1
B:b
(2)除了在模式匹配中使用之外,unapply 方法可以让你结构 case class 来提取它的字段
代码如下(示例):
case class Person(salaryList: List[Double]=List(0.0),monthList:List[(Int,Int)]=List((-1,1)))
object Lesson05_case_class {
def main(args: Array[String]): Unit = {
var a = List(1000.0)
var b = List((1,3))
val p1 = Person(a,b)
println(p1)
val Person(salaryList, _) = p1
val Person(_,monthList) = p1
println(salaryList)
println(monthList)
}
}
执行结果:
---------------------------------------------------------------------------------------------------------------------------
Person(List(1000.0),List((1,3)))
List(1000.0)
List((1,3))
总结
以上就是今天要讲的内容,本文就scala的Trait使用方面列举了一些示例及使用技巧。
更多参考:https://docs.scala-lang.org/zh-cn/tour/tour-of-scala.html