11.scala案例类(Case Classes)

Posted 大数据群英萃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.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) message1.sender = "travis@washington.us"


你不能给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

尽管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 message5.recipient message5.body

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

推荐阅读:




以上是关于11.scala案例类(Case Classes)的主要内容,如果未能解决你的问题,请参考以下文章

在火花数据框中使用案例类的好处[重复]

仅当在 main 方法之外定义案例类以创建 Dataset[case class] 或 Dataframe[case class]

Scala案例类伴随对象 - 类型名称冲突

Case Classes和模式匹配

Scala 的 Case Classes 和 Pattern Matching

JAVA匿名内部类(Anonymous Classes)