在网上发现一篇非常好的文章,正好我在做Scala系列博客,于是转载到我的博客中。
在Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下:
1、初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new;
1 |
scala> case class Iteblog(name : String)
|
4 |
scala> val iteblog = Iteblog( "iteblog_hadoop" )
|
5 |
iteblog : Iteblog = Iteblog(iteblog _ hadoop)
|
7 |
scala> val iteblog = new Iteblog( "iteblog_hadoop" )
|
8 |
iteblog : Iteblog = Iteblog(iteblog _ hadoop)
|
2、toString的实现更漂亮;
2 |
res 5 : Iteblog = Iteblog(iteblog _ hadoop)
|
3、默认实现了equals 和hashCode;
1 |
scala> val iteblog 2 = Iteblog( "iteblog_hadoop" )
|
2 |
iteblog 2 : Iteblog = Iteblog(iteblog _ hadoop)
|
4 |
scala> iteblog == iteblog 2
|
7 |
scala> iteblog.hashCode |
4、默认是可以序列化的,也就是实现了Serializable ;
04 |
scala> import java.io. _
|
07 |
scala> val bos = new ByteArrayOutputStream
|
08 |
bos : java.io.ByteArrayOutputStream =
|
10 |
scala> val oos = new ObjectOutputStream(bos)
|
11 |
oos : java.io.ObjectOutputStream = java.io.ObjectOutputStream @ 4 c 257 aef
|
13 |
scala> oos.writeObject(iteblog) |
16 |
a : A = $iwC$$iwC$A @ 71687 b 10
|
18 |
scala> oos.writeObject(a) |
19 |
java.io.NotSerializableException : $iwC$$iwC$A
|
5、自动从scala.Product中继承一些函数;
6、case class构造函数的参数是public级别的,我们可以直接访问;
2 |
res 11 : String = iteblog _ hadoop
|
7、支持模式匹配;
其实感觉case class最重要的特性应该就是支持模式匹配。这也是我们定义case class的唯一理由,难怪Scala官方也说:It makes only sense to define case classes if pattern matching is used to decompose data structures. 。来看下面的例子:
01 |
object TermTest extends scala.App {
|
02 |
def printTerm(term : Term) {
|
17 |
def isIdentityFun(term : Term) : Boolean = term match {
|
18 |
case Fun(x, Var(y)) if x == y = > true
|
21 |
val id = Fun( "x" , Var( "x" ))
|
22 |
val t = Fun( "x" , Fun( "y" , App(Var( "x" ), Var( "y" ))))
|
25 |
println(isIdentityFun(id))
|
26 |
println(isIdentityFun(t))
|
分享到:
相关推荐
Case Class与模式匹配密切相关,因为它们可以作为模式的一部分来使用。以下是模式匹配的一些关键点: 1. **案例定义**:在匹配表达式中,`case`关键字后面跟一个模式,可以是变量、常量、类型、Case Class实例等。 ...
允许运行时数据用作Scala案例类定义: 在运行时定义并加载案例类 通过类型别名的伪Type-Provider 运行时代码生成和评估可以在scala.tools.reflect.ToolBox完成,但是每个包只能创建一个类(请参见此)。 因此,...
4. **case class 和 class 类的区别**: - `case class` 提供了自动的 equals, hashCode, copy, toString 等方法,通常用于数据传输对象(DTO)。 - `class` 没有这些便利,需要手动实现上述功能。 5. **unapply ...
9. case class:case class是Scala中一种特殊的类,通常用于模式匹配。它们的构造器中的每个参数默认都是val,而不是var,因为它们是不可变的。使用case class时不需要new关键字,因为它有一个隐式的apply方法。 10...
注:此处的普通类指的是scala中定义的非case class的类框架在底层将其视作java定义的标准bean类型来处理而scala中定义的普通bean类,不具备字段的java标准getters和setters,因而会处理失败,可以通过【@Bean...
例如,`case class`用于创建模式匹配友好的数据结构,而`trait`则提供了接口和混入(mix-in)多重继承的功能。此外,`Option`类型是Scala处理null安全的一种方式,它强制程序员明确处理空值情况,避免了常见的...
Scala可以无缝地与Java代码一起工作,因为它能直接调用Java的API,并且Java也能调用Scala的方法。 通过"Scala编程例子"的学习,初学者可以逐步了解并掌握这些概念,从而在实践中运用Scala的强大功能。压缩包中的...
在Scala中,样例类(Case Class)是一种特殊类型的类,主要用于模式匹配和不可变数据结构的构建。它们提供了许多便利的功能,如自动实现`equals`、`hashCode`、`toString`等方法,简化了开发者的编码工作量。 #### ...
它通常与`case`关键字一起使用,创建案例类或者匹配数据结构。 6. **类型推断**:Scala具有强大的类型推断能力,可以自动确定变量或函数的类型,从而减少代码的冗余。 7. **特质(Trait)**:特质在Scala中提供了...
5. case class和class的区别 Case class是Scala语言中的一个样本类,具有以下特点: * 自动添加与类名一致的构造函数 * 样本类中的参数默认是val关键字,不可以修改 * 默认实现了toString,equals,hashcode,copy...
当与来自Scala的基于第三方的基于json的API进行交互时,可以使用案例类对API的响应进行建模。 如果JSON具有某些属性(例如,均匀列表),则可以轻松创建具有相同结构的case类。 使用一些反序列化魔术,可以更轻松地...
### Scala与设计模式 #### 一、概述 随着软件工程的发展,设计模式逐渐成为软件开发中的重要组成部分。《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software...
4. **模式匹配**:Scala中的模式匹配用于解构复杂数据结构,例如case class和case对象。 5. **集合库**:Scala强大的集合API,如map、filter、fold等操作,以及惰性求值和视图的概念。 6. **函数式编程**:不可变...
case class User(name: String, age: Int) val user = User("Alice", 30) ``` 要将 `User` 插入到 "users" 集合中,可以使用 `insertOne` 方法: ```scala collection.insertOne(user).subscribe( result => ...
11. **Case Class**:Scala的case class不仅用于模式匹配,还提供了一种创建轻量级数据结构的方式,常用于表示数据记录。 12. **类型推断**:Scala具有强大的类型推断机制,可以让代码更简洁,减少显式的类型声明。...
函数定义可以使用匿名函数和高阶函数,类和对象通过case class和trait实现。 **2. 面向对象编程** Scala的面向对象特性包括类、继承、封装和多态。类通过`class`关键字定义,可以有构造器、方法和属性。继承使用`...
以创建三个实体类(用户、订单、商品)为例,在Java中,需要为每个属性定义私有变量,然后提供getter和setter方法,而Scala中,我们可以使用case class的语法糖,大大减少了代码量。如: ```java // Java代码片段 ...
它使用`case class`来创建模式匹配友好的数据结构,使用`val`和`var`声明不可变和可变变量。 2. **类型系统**:Scala拥有静态类型系统,意味着每个变量或表达式都有一个明确的类型。它支持类型推断,程序员不必总是...