`
flychao88
  • 浏览: 751908 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Scala class与Case class的区别

 
阅读更多

在网上发现一篇非常好的文章,正好我在做Scala系列博客,于是转载到我的博客中。

在Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下:

  1、初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new;

1 scala> case class Iteblog(name:String)
2 defined class Iteblog
3  
4 scala> val iteblog = Iteblog("iteblog_hadoop")
5 iteblog: Iteblog = Iteblog(iteblog_hadoop)
6  
7 scala> val iteblog = new Iteblog("iteblog_hadoop")
8 iteblog: Iteblog = Iteblog(iteblog_hadoop)

  2、toString的实现更漂亮;

1 scala> iteblog
2 res5: Iteblog = Iteblog(iteblog_hadoop)

  3、默认实现了equals 和hashCode;

1 scala> val iteblog2 = Iteblog("iteblog_hadoop")
2 iteblog2: Iteblog = Iteblog(iteblog_hadoop)
3  
4 scala> iteblog == iteblog2
5 res6: Boolean = true
6  
7 scala> iteblog.hashCode
8 res7: Int = 57880342

  4、默认是可以序列化的,也就是实现了Serializable ;

01 scala> class A
02 defined class A
03  
04 scala> import java.io._
05 import java.io._
06  
07 scala> val bos = newByteArrayOutputStream
08 bos: java.io.ByteArrayOutputStream =
09  
10 scala> val oos = new ObjectOutputStream(bos)
11 oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@4c257aef
12  
13 scala> oos.writeObject(iteblog)
14  
15 scala> val = new A
16 a: = $iwC$$iwC$A@71687b10
17  
18 scala> oos.writeObject(a)
19 java.io.NotSerializableException: $iwC$$iwC$A

  5、自动从scala.Product中继承一些函数;
  6、case class构造函数的参数是public级别的,我们可以直接访问;

1 scala> iteblog.name
2 res11: 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) {
03     term match {
04       case Var(n) =>
05         print(n)
06       case Fun(x, b) =>
07         print("^" + x + ".")
08         printTerm(b)
09       case App(f, v) =>
10         print("(")
11         printTerm(f)
12         print(" ")
13         printTerm(v)
14         print(")")
15     }
16   }
17   def isIdentityFun(term: Term): Boolean = term match {
18     case Fun(x, Var(y)) if == =true
19     case _ =false
20   }
21   val id = Fun("x", Var("x"))
22   val = Fun("x", Fun("y", App(Var("x"), Var("y"))))
23   printTerm(t)
24   println
25   println(isIdentityFun(id))
26   println(isIdentityFun(t))
分享到:
评论

相关推荐

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

    Case Class与模式匹配密切相关,因为它们可以作为模式的一部分来使用。以下是模式匹配的一些关键点: 1. **案例定义**:在匹配表达式中,`case`关键字后面跟一个模式,可以是变量、常量、类型、Case Class实例等。 ...

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

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

    Scala考试题1

    4. **case class 和 class 类的区别**: - `case class` 提供了自动的 equals, hashCode, copy, toString 等方法,通常用于数据传输对象(DTO)。 - `class` 没有这些便利,需要手动实现上述功能。 5. **unapply ...

    Scala基础与实践

    9. case class:case class是Scala中一种特殊的类,通常用于模式匹配。它们的构造器中的每个参数默认都是val,而不是var,因为它们是不可变的。使用case class时不需要new关键字,因为它有一个隐式的apply方法。 10...

    Spark2.x Scala Class创建DataFrame

     注:此处的普通类指的是scala中定义的非case class的类框架在底层将其视作java定义的标准bean类型来处理而scala中定义的普通bean类,不具备字段的java标准getters和setters,因而会处理失败,可以通过【@Bean...

    学习scala好的项目

    例如,`case class`用于创建模式匹配友好的数据结构,而`trait`则提供了接口和混入(mix-in)多重继承的功能。此外,`Option`类型是Scala处理null安全的一种方式,它强制程序员明确处理空值情况,避免了常见的...

    Scala编程例子

    Scala可以无缝地与Java代码一起工作,因为它能直接调用Java的API,并且Java也能调用Scala的方法。 通过"Scala编程例子"的学习,初学者可以逐步了解并掌握这些概念,从而在实践中运用Scala的强大功能。压缩包中的...

    Scala样例类练习.docx

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

    scala编程入门教材

    它通常与`case`关键字一起使用,创建案例类或者匹配数据结构。 6. **类型推断**:Scala具有强大的类型推断能力,可以自动确定变量或函数的类型,从而减少代码的冗余。 7. **特质(Trait)**:特质在Scala中提供了...

    1、scala面试题(25问).pdf

    5. case class和class的区别 Case class是Scala语言中的一个样本类,具有以下特点: * 自动添加与类名一致的构造函数 * 样本类中的参数默认是val关键字,不可以修改 * 默认实现了toString,equals,hashcode,copy...

    json2caseclass:通过将JSON转换为case类来启动您的scala API客户端

    当与来自Scala的基于第三方的基于json的API进行交互时,可以使用案例类对API的响应进行建模。 如果JSON具有某些属性(例如,均匀列表),则可以轻松创建具有相同结构的case类。 使用一些反序列化魔术,可以更轻松地...

    Scala和设计模式.pdf

    ### Scala与设计模式 #### 一、概述 随着软件工程的发展,设计模式逐渐成为软件开发中的重要组成部分。《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software...

    atomic-scala-examples

    4. **模式匹配**:Scala中的模式匹配用于解构复杂数据结构,例如case class和case对象。 5. **集合库**:Scala强大的集合API,如map、filter、fold等操作,以及惰性求值和视图的概念。 6. **函数式编程**:不可变...

    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数据结构和算法.docx

    11. **Case Class**:Scala的case class不仅用于模式匹配,还提供了一种创建轻量级数据结构的方式,常用于表示数据记录。 12. **类型推断**:Scala具有强大的类型推断机制,可以让代码更简洁,减少显式的类型声明。...

    Scala(中文完整版).zip

    函数定义可以使用匿名函数和高阶函数,类和对象通过case class和trait实现。 **2. 面向对象编程** Scala的面向对象特性包括类、继承、封装和多态。类通过`class`关键字定义,可以有构造器、方法和属性。继承使用`...

    Scala文档.docx

    以创建三个实体类(用户、订单、商品)为例,在Java中,需要为每个属性定义私有变量,然后提供getter和setter方法,而Scala中,我们可以使用case class的语法糖,大大减少了代码量。如: ```java // Java代码片段 ...

    scala 案例

    它使用`case class`来创建模式匹配友好的数据结构,使用`val`和`var`声明不可变和可变变量。 2. **类型系统**:Scala拥有静态类型系统,意味着每个变量或表达式都有一个明确的类型。它支持类型推断,程序员不必总是...

Global site tag (gtag.js) - Google Analytics