`
zsjg13
  • 浏览: 145232 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

case classes

阅读更多

作为Java开发人员,我们习惯于JavaBean风格的domain classes,它们不仅包含带有getters和setters的域,还有构造器以及hashCode、equals、toString方法。

 

在Scala中实现上面所说的很简单,只需要在类声明前加上case。例如:

scala> case class Money(amount:Int=1, currency:String="USD")

这样,我们就定义了一个Money类,它有2个immutable fields。

 

此时Money类不仅仅拥有了传统的JavaBean风格的domain class所拥有的特性,还有了模式匹配的强大机制。case类似于Java中的switch语句,但是它更灵活,后面我们会看到。case classes还有其他的特性,其中之一就是工厂方法用于创建对象(无需用new关键字来创建对象)。

 

默认,Scala类中声明的字段是public的,当然我们也可以写成private,还可以用var声明为mutable字段。

例如:case class Money(private val amount:Int, private var currency:String)

 

用最简短的方式创建Money的一个实例很简单:

scala> val defaultAmount = Money()

defaultAmount: Money = Money(1, USD)

scala> val fifteenDollars = Money(15, "USD")

fifteenDollars: Money = Money(15, USD)

scala> val fifteenDollars = Money(15)

fifteenDollars: Money = Money(15, USD)

 

但是,像下面这样调用就是错的,当你只提供第2个参数的时候:

scala> val someEuros = Money("EUR")

 

所以,我们应该显式指出字段名,例如:

scala> val someEuros = Money(currency = "EUR")

 

构造实例时,还有个有用的方法就是copy方法,它会从原实例创建一个新实例,并利用给定的参数替换掉一些值:

scala> val tenEuros = twentyEuros.copy(10)

tenEuros: Money = Money(10, EUR)

当然也可以像前面那样,显式指定字段名,如:

scala> val twentyDollars = twentyEuros.copy(currency="USD")

 

在Scala中,我们用def关键字来定义一个class method或一个function。例如:

scala> case class Money(val amount:Int=1, val currency:String="USD") {

def +(other: Money) : Money = Money(amount + other.amount)

}

注意,我们用+作为方法名,还在方法签名的声明中加入了返回类型(是可选的,因为Scala的类型推断会算出类型,但显式写出来对于public methods来说是一个好的文档实践,方法如果没有指明其他scope,那默认就是public的)

 

还有,就是Scala中,方法最后面的return word是可选的,最后一条语句总是作为返回值返回给它的调用者。通常建议省略掉return。

 

现在,我们就可以将2个Money实例加起来了,例如:

scala> Money(12) + Money(34)

res5: Money = Money(46, USD)

 

一旦,我们开始操作对象的集合时,事情就开始变得有趣了,Scala的functional编程对此帮助很大。

scala> val numbers = List(1,2,5)

numbers : List[Int] = List(1,2,5)

 

Scala collections有组织地将immutable collections和mutable collections区分开,通过默认构造的是immutable collections来鼓励immutability。也就是当additions,updates,removals操作后返回的是新集合。

 

scala> for (n <- numbers) println("Number " + n)

 

还有种写法就是更functional style,就是使用lambda表达式,有时叫作闭包,简短来说,lambda就是函数,你可以将其作为参数传递。这些函数带有输入参数,并返回方法体中的最后一条语句或行)。格式为:

functionName { input => body }

 

具体的例子就是:

scala> numbers.foreach { n:Int => println("Number " + n) }

上面的代码中,方法体中只有一条语句,也就是println...,因此返回Unit,大致类似于Java中的void,但void并不返回任何东西。

 

前面,我们说过,Scala collections默认是immutable的,这保证了在处理多处理器架构时行为的正确性。Scala的集合和Java的集合相比,它支持并行操作。

 

 

分享到:
评论

相关推荐

    shapeless_2.11-2.3.2.zip

    三、Case Classes与Type Classes shapeless对Scala的Case Classes提供了强大的支持。Case Classes通常用于定义轻量级的数据结构,它们在shapeless中可以被自动转换为HList,反之亦然。这种转换使得我们可以对Case ...

    Scala助手StreamyJ.zip

    StreamyJ 使得用 Jackson 编写 Scala 解析器变的简单了:将 JsonToken 常量转换成 case classes(Scala 的一种模式匹配),并允许类型匹配。 提供了一种机制——允许部分解析器有权对特定的已解析的项目采取措施。 ...

    SORM0.8.jar

    You work with case classes, collections and other standard Scala data types instead of tables, rows, foreign keys and relations. 从持久层完全分离的域模型. There are no annotations, special types or ...

    Scala By Examples

    而"Case Classes and Pattern Matching"进一步扩展了这一主题,案类(Case Classes)是Scala中用于数据建模的便利工具,它们与模式匹配结合使用,可以简化数据解析和解构的过程。 "Generic Types and Methods"章节...

    Learning.Scala.Practical.Functional.Programming.for.the.JVM

    Why learn Scala? You don’t need to be a data scientist or distributed computing expert to appreciate this ... Objects, Case Classes and Traits Chapter 10. Advanced Typing Appendix A. Reserved Words

    scala for the impatient

    Working with higher-order functions and the powerful Scala collections library * Leveraging Scala's powerful pattern matching and case classes * Creating concurrent programs with Scala actors * ...

    Programming in Scala, 2nd Edition

    The copy method on case classes This and book is completed and currently in production. The paper book will be available in early January, 2011. The final PDF eBook is available now. You can currently...

    Scala编程 (完整版)带书签目录

    9. **Case Classes**:Scala的case classes是轻量级的模式匹配构造,常用于创建数据容器,同时提供自动的equals、hashCode和toString方法。 10. ** Trait**:Traits是Scala中的一个独特特性,类似Java的接口,但...

    scala设计模式

    例如,Scala中的case classes和case objects能够很自然地实现单例模式,而无需额外的工厂模式来创建对象实例。 文章重点介绍了几种经典的设计模式以及在Scala中的实现方式: 1. 工厂方法模式:这种模式通过将对象...

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

    Flink通过类型信息来管理这些数据类型,这包括Java和Scala的基础数据类型、元组、样例类(case classes)以及Java简单对象(POJOs)。 1. **基础数据类型**:Flink支持所有Java和Scala的基本类型,如Int、Double、...

    scala pattern match

    1. **案例类(Case Classes)**:这是Scala中一种特殊的类,主要用于模式匹配。它们自动实现了`equals`和`hashCode`方法,以及`toString`方法,非常适合用作模式匹配中的模式。 2. **提取器(Extractors)**:在...

    scala-2.11.12.msi 安装程序

    8. **语法糖**:Scala的语法糖特性使得编写代码更加简洁,如for-comprehensions(用于迭代和集合操作)和case classes(用于模式匹配)。 9. **与Java兼容**:Scala运行在Java虚拟机(JVM)上,可以无缝与Java库...

    Programming in Scala

    15. **Case Classes and Pattern Matching(案例类与模式匹配)**: - 案例类(case classes)的特点及其应用场景。 - 模式匹配(pattern matching)的原理及如何应用于解构数据结构。 - 实际案例分析,展示如何高效...

    Python algorithm

    4. 样例类(Case Classes)和样例对象(Case Objects):这些是为不可变数据和模式匹配设计的特殊类,它们简化了数据定义和操作。 5. 并发模型(Concurrency Model):Scala提供了高级的并发构建,如actors,它们为...

    jackson-module-jsonSchema-2.6.5.zip

    它不仅提供了基本的数据序列化和反序列化功能,还支持生成高效的代码,如Case Classes和Optimistic Concurrency Control(乐观并发控制)。 标签 "开源项目" 指出这两个库都是开放源代码的,意味着它们遵循特定的...

    Android-AndroidCleanArchitecture的简易demo

    - 用例类(UseCase classes),负责协调业务逻辑。 - 实体类(Entity classes),表示应用程序的核心数据模型。 - 数据源接口(Repository interfaces),定义数据存取方法。 - 数据源实现(Repository ...

    Flink 数据类型与序列化.pdf

    Flink支持多种数据类型,包括基本数据类型、POJOs(普通旧Java对象)、元组(Tuples)、Scala案例类(case classes)、枚举、泛型类型以及特殊类型如Row和RawValue等。 数据类型对于Flink的操作符函数来说至关重要...

Global site tag (gtag.js) - Google Analytics