Scala之case class
我们在模式匹配中可以见到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相关推荐
- Scala中Case Class使用详细解析
2019独角兽企业重金招聘Python工程师标准>>> 简介 Case Class是样例类,能够被优化以用于模式匹配. 构造器中的参数如果不被声明为var的话,默认是val类型 ...
- scala中case的用法
scala中没有switch,但是有case,其case相当强大,有各种不同的匹配方式. 一.简单匹配,值匹配: 例 a: val bools = List(true, false) for (boo ...
- scala中case class与一般的class的区别
(1)case class初始化的时候可以不用new,也可以加上,但是class必须加new (2)默认实现了equals.hashCode方法 (3)默认是可以序列化的,实现了Serializalb ...
- scala的 case class与class的区别
1.初始化的时候,不需要new,当然你也可以加上,普通类一定需要加上new class ABC(name:String){def ff(): Unit ={} }case class ABC1(nam ...
- scala case语句_Scala模式与case语句匹配
scala case语句 Scala supports inbuilt pattern matching mechanism which is one of the more powerful fea ...
- scala中json与case class对象的转换, spark读取es json转换成case class
ilinux_one scala中json与对象的转换 遇到的问题 因为要把spark从es读出来的json数据转换为对象,开始想用case class定义类型,通过fastjson做转换.如下 复制 ...
- 2021年大数据常用语言Scala(一):Scala简介
目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...
- 大数据系列修炼-Scala课程07
由于昨天下班后有点困,就没有来及写博客,今天会把它补上!把这个习惯坚持下去! 关于Scala高阶函数详解 1.Scala高阶函数代码实现:高阶函数就是在我们函数中套用函数 2.高阶函数代码详解:高阶函 ...
- 【开发工具】SCALA
Scala是一门多范式的编程语言,一种类似java的编程语言 [1] ,设计初衷是实现可伸缩的语言 [2] .并集成面向对象编程和函数式编程的各种特性. Scala编程语言抓住了很多开发者的眼球.如果 ...
最新文章
- treeview 保持选中状态
- springMVC参数绑定与数据回显
- UIVisualEffectView实现毛玻璃效果
- python 事件通知模式_请问在 Python 的事件系统中,如何可以通过事件通知立刻终结一个正在运行的子线程?...
- 经典面试题:Redis 内存满了怎么办?
- redis源码之sds
- 使用Java 8在地图上流式传输
- C#LeetCode刷题之#893-特殊等价字符串组​​​​​​​​​​​​​​(Groups of Special-Equivalent Strings)
- 8.在第7步的基础上为我们的程序添加负载均衡支持
- Python - Flask 框架返回的中文是Unicode 编码,如何解决
- GitHub上有不错的 C 开源项目?
- 微信活动报名源码php,fb1357 Thinkphp活动报名发布微信小程序源码 聚会活动报名小程序含说明...
- java实现从浏览器读取Csv文件解析成 ListMap
- 北大青鸟资源管理系统
- k8s(一)、 1.9.0高可用集群本地离线部署记录
- Ichorbio/艾美捷 研究级阿达木单抗生物仿制药
- 并行计算复习————第一篇 并行计算硬件平台:并行计算机
- 从权威网站上“偷”窃
- 产品检验的数字化转型应用
- c语言编写消防车声音程序教程,单片机实现消防车报警声音的设计
热门文章
- 平板电脑与计算机连接网络,平板电脑连接网络的方法
- 是不是安装了anaconda就不用安装python呢_dnf魔界是怎么样的,今天来带大家见识一下...
- 关于打架以及打架的策略的问题
- 《永不止步》--[奥]力克胡哲
- E01 GBase 8a MPP Cluster V95 安装和卸载
- 曝孙杨已获驾照 曾无证驾车载年轻女子肇事
- Mybatis关系映射一对一的关系
- AI也有偏见:你在机器“眼里”是好人还是坏蛋?
- 基于Halcon学习的二维码识别【七】2d_data_codes_rectify_symbol.hdev
- Android中设置定时闹钟以及AlarmManager详解