在网上发现一篇非常好的文章,正好我在做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 a = new A |
16 | a: 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 x == y => true |
19 | case _ => false |
20 | } |
21 | val id = Fun("x", Var("x")) |
22 | val t = Fun("x", Fun("y", App(Var("x"), Var("y")))) |
23 | printTerm(t) |
24 | println |
25 | println(isIdentityFun(id)) |
26 | println(isIdentityFun(t)) |
本文深入探讨了Scala中CaseClass的特点与优势,包括初始化、toString实现、默认equals和hashCode、序列化、自动继承函数、支持模式匹配等功能,并通过实例展示了如何在实际编程中运用CaseClass来简化数据结构的处理。
762

被折叠的 条评论
为什么被折叠?



