在网上发现一篇非常好的文章,正好我在做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))
|
分享到:
相关推荐
允许运行时数据用作Scala案例类定义: 在运行时定义并加载案例类 通过类型别名的伪Type-Provider 运行时代码生成和评估可以在scala.tools.reflect.ToolBox完成,但是每个包只能创建一个类(请参见此)。 因此,...
Scala 专题教程 - Case Class和模式匹配-内含源码以及设计说明书(可以自己运行复现).zip
注:此处的普通类指的是scala中定义的非case class的类框架在底层将其视作java定义的标准bean类型来处理而scala中定义的普通bean类,不具备字段的java标准getters和setters,因而会处理失败,可以通过【@Bean...
当与来自Scala的基于第三方的基于json的API进行交互时,可以使用案例类对API的响应进行建模。 如果JSON具有某些属性(例如,均匀列表),则可以轻松创建具有相同结构的case类。 使用一些反序列化魔术,可以更轻松地...
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许...Scala的Case Class及其内置的模式匹配相当于函数式编程语言中常用的代数类型(Algebraic Type)。
24.2.2 ClassTag、TypeTag与Manifest 457 24.3 Scala 的高级运行时反射API 458 24.4 宏 461 24.4.1 宏的示例:强制不变性 463 24.4.2 关于宏的最后思考 466 24.5 本章回顾与下一章提要 466 附录A...
scala的orm框架,相比其他orm更为简洁 // Declare a model: case class Artist( name : String, genres : Set[Genre] ) case class Genre( name : String ) // Initialize SORM, automatically generating schema:...
case class Tape[T](left: List[T], cell: T, right: List[T])(implicit func: Func[T]) { private def headOf(list:List[T]) = if (list.isEmpty) func.zero else list.head private def tailOf(list:List[T]) = ...
scala> case class User(id: Int, name: String, groups: List[String]) defined class User scala> val joe = User(1000, "joe", List("admin", "staff")) joe: User = User(1000,joe,List(admin, staff)) scala> ...
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》英文第二版: Scala for the Impatient Second Edition Cay S. Horstmann 目录: 1 THE BASICS A1 1 1.1 The Scala Interpreter 1 1.2 Declaring Values and Variables 4 1.3 Commonly Used Types 5 ...
14.11 case语句中的中置表示法 231 14.12 匹配嵌套结构 232 14.13 样例类是邪恶的吗 233 14.14 密封类 234 14.15 模拟枚举 235 14.16 Option类型 235 14.17 偏函数 L2 236 练习 238 第15章 注解 A2243 15.1...
spark-db-case-class:将Spark DB名称映射到case类中的字段
PureCSV, Scala的类型安全和样板自由CSV库 PureCSV PureCSV是用于处理CSV格式的Scala 库。 库去掉了使用CSV所需的大部分样板文件scala> import purecsv.unsafe._scala> case class
该项目还演示了如何使用这些不同的 JSON 库来反序列化 Scala case class 。 当然,我们也提供了运行基准测试和生成测试数据的代码,可能有用.ja关于图书馆其中一些库(Rapture 和 Json4s)使用 ,Java JSON 解析库...
它使用反射,因此如果您使用它,您可能需要将libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaV到您的项目中。 对象的枚举 定义 sealed abstract class Color ( red : Double , green : Double...
asmifier-caseclass-experiments 在各种 case 类上运行 ASMifier 以检查转储输出的差异,并推导出将值成员任意添加到动态类定义的规则。 实现基于文件或“离线”数据定义 Scala 案例类的目标。 // 这些步骤是使用...
case class Equals [ A > : B < : B , B ]() // this checks type equality type S = x - > : y - > : z - > : ( x @@ z @@ (y @@ z) ) type K = x - > : y - > : x type result = ( S @@ K @@ K @@ a ) # - > * ...
匹配样例类 scala可以使用模式匹配来匹配样例类,从而可以快速获取样例类中的成员数据。...case class Person(name:String, age:Int) case class Order(id:String) def main(args: Array[String]): Unit =
这旨在用于与Hibernate之类的库一起使用scala case clss,该库不需要用于通过反射填充对象的args构造函数 例如: : 用法: @ NoArgsConstructor case class Person ( firstName : String , lastName : String ) ...