在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))
转载地址:http://www.iteblog.com/archives/1508