`

Scala case class

 
阅读更多

Scala case class

case class很像普通的类,它们的差异我们在后面会解释。case class适用于建模不变的数据。

定义一个case class

一个最小的case class需要关键字case class,一个标识符和一个参数列表(这个可以为空):

case class Book(isbn: String) {

}

object Book {
  def main(args: Array[String]): Unit = {
    val frankenstein = Book("978-0486282114")
    println(frankenstein)
  }
}

 注意当初始化Book case class时没有用new关键字。这是因为case class默认有一个apply方法会关注对象的构造。

当你用参数创建一个case class时,参数时public的val s。

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(是不可变的),可以在case class中使用var s来声明变量,但是这是不被鼓励的。

 

比较

case class是根据结构来进行比较的,不是根据引用。

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

尽管message2和message3指向不同的对象,但是每个对象的值是相等的。

 

复制

你可以简单的使用copy方法来创建一个case class实例的副本(浅拷贝)。你可以随意的改变构造器的参数。

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"

 message4的recipient被用作message5的sender,message4的body被直接拷贝到message5。

分享到:
评论

相关推荐

    case-class-generator:在运行时动态定义和加载Scala类。 有助于将JSON模式快速转换为Scala案例类

    允许运行时数据用作Scala案例类定义: 在运行时定义并加载案例类 通过类型别名的伪Type-Provider 运行时代码生成和评估可以在scala.tools.reflect.ToolBox完成,但是每个包只能创建一个类(请参见此)。 因此,...

    Scala样例类练习.docx

    在Scala中,样例类(Case Class)是一种特殊类型的类,主要用于模式匹配和不可变数据结构的构建。它们提供了许多便利的功能,如自动实现`equals`、`hashCode`、`toString`等方法,简化了开发者的编码工作量。 #### ...

    Scala编程详解 第21讲-Scala编程详解:Actor入门 共8页.pptx

    Scala推荐使用`case class`作为消息类型,因为它们具有自动序列化的能力,非常适合在网络或Actor间传递。`case class`还支持模式匹配,使得Actor可以轻松地处理不同类型的消息。例如,创建一个处理用户注册和登录的...

    mongo-scala-drive的使用demo

    case class User(name: String, age: Int) val user = User("Alice", 30) ``` 要将 `User` 插入到 "users" 集合中,可以使用 `insertOne` 方法: ```scala collection.insertOne(user).subscribe( result => ...

    scala编程基础

    在实际开发中,通常会使用`case class`来定义消息类型,这样可以让代码更具可读性和可维护性。 **示例:** ```scala case class StartMessage() case class StopMessage() class MyActor extends Actor { ...

    Scala设计模式

    case class Address(street: String, city: String, zipCode: Int) object ValueObjectPattern { def main(args: Array[String]): Unit = { val address1 = Address("123 Main St", "Anytown", 90210) val ...

    graphene-core-0.3.2.zip

    《graphene-core-0.3.2.zip:Scala Case Class序列化与反序列化的核心工具》 在IT领域,数据序列化与反序列化是至关重要的环节,它使得程序能够将对象状态转换为可存储或传输的数据格式。针对这一需求,开源项目...

    scala语言for循环中的模式匹配

    case class Dog(val name: String, val age: Int) for (Dog(name, age) (Dog("ouou", 2), Dog("yaya", 1), Dog("meimei", 2))) { println(s"\nDog $name is $age years old") } ``` 在上面的代码中,我们使用了...

    scala测试用例之单位换算及不同单位运算.zip

    case class Quantity(value: Double, unit: UnitType) { def to(unitTo: UnitType): Quantity = { // 这里实现具体的单位转换逻辑 } } ``` 编写测试用例时,我们会在ScalaTest中创建一个`UnitConversionSpec`类...

    Scala 专题教程 - Case Class和模式匹配-内含源码以及设计说明书(可以自己运行复现).zip

    本教程将深入探讨Scala中的Case Class和模式匹配这两个关键概念,通过实例和源代码帮助你理解和掌握它们。下面是对每个知识点的详细说明。 **Case Class** 在Scala中,Case Class是一种特殊的类,它被设计用于模式...

    大数据课程-Scala编程基础-2.Scala语言基础_lk_edit.ppt

    case class Point(x: Double, y: Double) { def +(other: Point): Point = Point(this.x + other.x, this.y + other.y) } val p1 = Point(1, 2) val p2 = Point(3, 4) val result = p1 + p2 // result将会是Point...

    语言类--effective scala

    case class Address(street: String, city: String, state: String, zip: String) case class Person(first: String, last: String, address: Option[Address]) val p1 = Some(Person("Fred", "Bloggs", None)) val...

    spark-db-case-class:将Spark DB名称映射到case类中的字段

    `spark-db-case-class`项目就是针对这种情况,它旨在帮助我们将Spark数据库表的列名映射到Scala的case类字段,从而简化数据操作流程。 首先,我们需要理解Spark的DataFrame。DataFrame是Spark SQL的核心概念,它是...

    common-4.17.37.Final.zip

    《深入剖析Scala Case App:构建命令行参数解析的利器》 在编程世界中,命令行接口(CLI)是软件与用户交互的一种基本方式,尤其在处理脚本任务或自动化流程时,CLI的简洁高效尤为突出。Scala作为一种强大的静态...

    spray-json框架介绍.pdf

    对于不包含在 `DefaultJsonProtocol` 中的类型,特别是自定义的 `case class`,你需要定义自己的 `JsonProtocol`。比如,如果你有一个 `case class` `MyInt`: ```scala case class MyInt(value: Int) ``` 你可以...

    spray-json框架介绍.docx

    除了基础类型和 `case class`,对于其他自定义类型,可以通过实现 `JsonWriter` 和 `JsonReader` 类型类来自定义转换逻辑。 总的来说,spray-json 是一个强大且灵活的 JSON 处理工具,它为 Scala 开发者提供了简洁...

    【Flink篇05】FlinkAPI之数据类型和UDF函数 1

    此外,Scala的`case class`和Java的POJOs也非常常见: ```scala case class Person(name: String, age: Int) val persons: DataStream[Person] = env.fromElements(Person("Adam", 17), Person("Sarah", 23)) ``` 2...

    spark sql 代码实现

    在 Scala 中,case class 提供了一些便利的特性,如自动实现的 `equals`、`hashCode` 和 `toString` 方法,以及解构赋值的能力: ```scala case class Person(idx: Int, name: String, age: Int) ``` 在 `...

    textrazor-1.0.1.zip

    通过定义数据模型,我们可以创建与CSV列对应的case class,然后使用该库来自动映射和验证CSV数据。 首先,让我们看看如何在项目中集成"object-csv"。解压"object-csv-1.0.1.zip"后,找到"object-csv-master"目录,...

    systembartint-1.0.4.zip

    使用这个库,开发者可以在编译时自动生成Avro schema对应的Scala case class,减少手动编写和维护代码的工作量。 【标签】"开源项目" 暗示了这两个压缩包中的内容都是开放源代码的软件。开源项目意味着任何个人或...

Global site tag (gtag.js) - Google Analytics