当前位置: 首页 > news >正文

12-scala样例类(Case Classes)

例类(Case classes)和普通类差不多,只有几点关键差别,接下来的介绍将会涵盖这些差别。样例类非常适合用于不可变的数据。

定义一个样例类

一个最简单的样例类定义由关键字case class,类名,参数列表(可为空)组成:

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

注意在实例化样例类Book时,并没有使用关键字new,这是因为样例类有一个默认的apply方法来负责对象的创建。

当你创建包含参数的样例类时,这些参数是公开(public)的val

case class Message(sender: String, recipient: String, body: String)
val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")

println(message1.sender)  // prints guillaume@quebec.ca
message1.sender = "travis@washington.us"  // this line does not compile

你不能给message1.sender重新赋值,因为它是一个val(不可变)。在样例类中使用var也是可以的,但并不推荐这样。

比较

样例类在比较的时候是按值比较而非按引用比较:

case class Message(sender: String, recipient: String, body: String)

val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val messagesAreTheSame = message2 == message3  // true

尽管message2message3引用不同的对象,但是他们的值是相等的,所以message2 == message3true

拷贝

你可以通过copy方法创建一个样例类实例的浅拷贝,同时可以指定构造参数来做一些改变。

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
message5.sender  // travis@washington.us
message5.recipient // claire@bourgogne.fr
message5.body  // "Me zo o komz gant ma amezeg"

上述代码指定message4recipient作为message5sender,指定message5recipient为”claire@bourgogne.fr”,而message4body则是直接拷贝作为message5body了。

相关文章:

  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功能组合的导出表格示例
  • 使用 ByteDance 的 UI-TARS Desktop 探索 AI 驱动的 GUI 自动化新前沿
  • 1007 Maximum Subsequence Sum
  • 如何在IDEA中借助深度思考模型 QwQ 提高编码效率?
  • DeepSeek+RAG局域网部署
  • 微软纳德拉最新一期访谈
  • 如何删除git上最后一次提交,Git日常使用操作说明。
  • python高级4
  • Mysql从入门到精通day3————记一次连接查询的武装渗透
  • 【二分查找 树状数组 差分数组 离散化 】P6172 [USACO16FEB] Load Balancing P|省选-
  • 牛顿-拉夫逊迭代法原理与除法器的软件与硬件实现
  • 六十天Linux从0到项目搭建第四天(通配符命令、其他命令、压缩解压工具、shell的感性理解、linux权限解析)
  • 从零实现本地文生图部署(Stable Diffusion)
  • 常见框架漏洞攻略-ThinkPHP篇
  • 人工智能AI术语
  • 排序--快排--Hoare法
  • BSides Vancouver 2018靶机通关教学
  • Wireshark网络抓包分析使用详解
  • 【从零实现Json-Rpc框架】- 入门准备篇
  • java项目之校园美食交流系统(源码+文档)
  • 美国第一季度经济环比萎缩0.3%
  • 中央网信办部署开展“清朗·整治AI技术滥用”专项行动
  • “上博号”彩绘大飞机今日启航:万米高空传播中国古代文化
  • 4月译著联合书单|心爱之物:热爱如何联结并塑造我们
  • 原国家有色金属工业局副局长黄春萼逝世,享年86岁
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电