第七章 scala语言--case_class

第七章 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值