我们在模式匹配中可以见到case

a match {case b => ...case _ => ...
}

我们在类定义时,有时也会见到case关键字

case class Person (age: Int, name: String)

那么,在类上加上case关键字意味着什么呢?

伴生对象

编译Person.scala会产生两个class, Person.class和Person$class. 编译器给scala自动添加了一个伴生对象object Person

apply()方法和unapply()方法

伴生对象Person里面实现了apply()方法如下,

public Person apply(int age, String name){return new Person(age, name);
}

所以我们创建一个实例的时候不需要使用关键字new,可以直接通过Person(age,name)来得到一个实例对象

伴生对象Person里面还实现了unapply()方法,将对象转为可选元组集合Option[Tuple]

    public scala.Option<scala.Tuple2<Object, Object>> unapply(Person person) {if (person == null) {return scala.None$.MODULE$;}return new scala.Some(new scala.Tuple2$mcll$sp(person.age, person.name))

我们来看看代码

object CaseClassDriver {def main(args: Array[String]): Unit = {val p = Person(13,"李程")println(p.toString)val p$ = Person.unapply(p)println(p$.toString)}
}/*** case class 编译后会生成两个class文件Person.class和Person$.class* Person$.class是伴生对象,实现了apply方法和unapply方法* apply方法返回一个实例对象* unapply方法将对象转为元组*/
case class Person(age: Int, name: String)

Case Class默认是Immutable

case类的字段会被编译器默认加上val关键字。
所以Person.class中的age和name都被定义成了final, 且伴生对象Person$.class的定义也是

public final class Person$ {...
}

toString()、hashCode()和equals()方法

Scala编译器负责(根据字段)给Case类重写toString()、hashCode()和equals()方法。

copy()方法,快速复制自己,并可以做少量变化

package base.day05.caseobject/*** @description CaseObjDriver* @author ZerlindaLi create at 2019/4/29 20:32* @version 1.0.0*/
object CaseClassDriver {def main(args: Array[String]): Unit = {val p = Person(13,"李程")val p2 = p.copy()val p22 = Person(13,"李程")val p3 = p.copy(age=14)println(p.toString + p2.toString + p3.toString)println(p.hashCode)println("p.equals(p):"+p.equals(p))println("p.equals(p22):"+p.equals(p22))println("p.equals(p2):"+p.equals(p2))println("p2.equals(p3):"+p2.equals(p3))val p$ = Person.unapply(p)println(p$.toString)}
}/*** case class 编译后会生成两个class文件Person.class和Person$.class 默认为Immutable* Person$.class是伴生对象,实现了apply方法和unapply方法* apply方法返回一个实例对象* unapply方法将对象转为元组* 重写了toString,equals,hashCode方法*/
case class Person(age: Int, name: String)

运行结果为

Person(13,李程)Person(13,李程)Person(14,李程)
-89502882
p.equals(p):true
p.equals(p22):true
p.equals(p2):true
p2.equals(p3):false
Some((13,李程))

实现Product和Serializable接口

Case类还实现了scala.Product和scala.Serializable接口(Product和Serializable实际上都是Traits)。

    // Product// def productArity: Int// def productElement(n: Int): Any// def productIterator: Iterator[Any]// def productPrefix = ""public int productArity() {return 2;}public Object productElement(int n) {switch (n) {case 0: return age();case 1: return name();default: throw new IndexOutOfBoundsException();}}public scala.collection.Iterator productIterator() {return scala.runtime.ScalaRunTime$.MODULE$.typedProductIterator(this);}public String productPrefix() {return "Person";}

Scala之case class相关推荐

  1. Scala中Case Class使用详细解析

    2019独角兽企业重金招聘Python工程师标准>>> 简介   Case Class是样例类,能够被优化以用于模式匹配. 构造器中的参数如果不被声明为var的话,默认是val类型 ...

  2. scala中case的用法

    scala中没有switch,但是有case,其case相当强大,有各种不同的匹配方式. 一.简单匹配,值匹配: 例 a: val bools = List(true, false) for (boo ...

  3. scala中case class与一般的class的区别

    (1)case class初始化的时候可以不用new,也可以加上,但是class必须加new (2)默认实现了equals.hashCode方法 (3)默认是可以序列化的,实现了Serializalb ...

  4. scala的 case class与class的区别

    1.初始化的时候,不需要new,当然你也可以加上,普通类一定需要加上new class ABC(name:String){def ff(): Unit ={} }case class ABC1(nam ...

  5. scala case语句_Scala模式与case语句匹配

    scala case语句 Scala supports inbuilt pattern matching mechanism which is one of the more powerful fea ...

  6. scala中json与case class对象的转换, spark读取es json转换成case class

    ilinux_one scala中json与对象的转换 遇到的问题 因为要把spark从es读出来的json数据转换为对象,开始想用case class定义类型,通过fastjson做转换.如下 复制 ...

  7. 2021年大数据常用语言Scala(一):Scala简介

    目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...

  8. 大数据系列修炼-Scala课程07

    由于昨天下班后有点困,就没有来及写博客,今天会把它补上!把这个习惯坚持下去! 关于Scala高阶函数详解 1.Scala高阶函数代码实现:高阶函数就是在我们函数中套用函数 2.高阶函数代码详解:高阶函 ...

  9. 【开发工具】SCALA

    Scala是一门多范式的编程语言,一种类似java的编程语言 [1] ,设计初衷是实现可伸缩的语言 [2] .并集成面向对象编程和函数式编程的各种特性. Scala编程语言抓住了很多开发者的眼球.如果 ...

最新文章

  1. treeview 保持选中状态
  2. springMVC参数绑定与数据回显
  3. UIVisualEffectView实现毛玻璃效果
  4. python 事件通知模式_请问在 Python 的事件系统中,如何可以通过事件通知立刻终结一个正在运行的子线程?...
  5. 经典面试题:Redis 内存满了怎么办?
  6. redis源码之sds
  7. 使用Java 8在地图上流式传输
  8. C#LeetCode刷题之#893-特殊等价字符串组​​​​​​​​​​​​​​(Groups of Special-Equivalent Strings)
  9. 8.在第7步的基础上为我们的程序添加负载均衡支持
  10. Python - Flask 框架返回的中文是Unicode 编码,如何解决
  11. GitHub上有不错的 C 开源项目?
  12. 微信活动报名源码php,fb1357 Thinkphp活动报名发布微信小程序源码 聚会活动报名小程序含说明...
  13. java实现从浏览器读取Csv文件解析成 ListMap
  14. 北大青鸟资源管理系统
  15. k8s(一)、 1.9.0高可用集群本地离线部署记录
  16. Ichorbio/艾美捷 研究级阿达木单抗生物仿制药
  17. 并行计算复习————第一篇 并行计算硬件平台:并行计算机
  18. 从权威网站上“偷”窃
  19. 产品检验的数字化转型应用
  20. c语言编写消防车声音程序教程,单片机实现消防车报警声音的设计

热门文章

  1. 平板电脑与计算机连接网络,平板电脑连接网络的方法
  2. 是不是安装了anaconda就不用安装python呢_dnf魔界是怎么样的,今天来带大家见识一下...
  3. 关于打架以及打架的策略的问题
  4. 《永不止步》--[奥]力克胡哲
  5. E01 GBase 8a MPP Cluster V95 安装和卸载
  6. 曝孙杨已获驾照 曾无证驾车载年轻女子肇事
  7. Mybatis关系映射一对一的关系
  8. AI也有偏见:你在机器“眼里”是好人还是坏蛋?
  9. 基于Halcon学习的二维码识别【七】2d_data_codes_rectify_symbol.hdev
  10. Android中设置定时闹钟以及AlarmManager详解