欢迎关注Hadoop、Spark、Flink、Hive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop
  1. 文章总数:978
  2. 浏览总数:11,981,353
  3. 评论:3939
  4. 分类目录:106 个
  5. 注册用户数:6130
  6. 最后更新:2018年12月15日
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
iteblog_hadoop
大数据技术博客公众号bigdata_ai
大数据猿:
bigdata_ai

Scala class和case class的区别

  在Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下:
  1、初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new;

scala> case class Iteblog(name:String)
defined class Iteblog

scala> val iteblog = Iteblog("iteblog_hadoop")
iteblog: Iteblog = Iteblog(iteblog_hadoop)

scala> val iteblog = new Iteblog("iteblog_hadoop")
iteblog: Iteblog = Iteblog(iteblog_hadoop)

  2、toString的实现更漂亮;

scala> iteblog
res5: Iteblog = Iteblog(iteblog_hadoop)

  3、默认实现了equals 和hashCode;

scala> val iteblog2 = Iteblog("iteblog_hadoop")
iteblog2: Iteblog = Iteblog(iteblog_hadoop)

scala> iteblog == iteblog2
res6: Boolean = true

scala> iteblog.hashCode
res7: Int = 57880342

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

scala> class A
defined class A

scala> import java.io._
import java.io._

scala> val bos = new ByteArrayOutputStream 
bos: java.io.ByteArrayOutputStream = 

scala> val oos = new ObjectOutputStream(bos)
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@4c257aef

scala> oos.writeObject(iteblog)

scala> val a = new A
a: A = $iwC$$iwC$A@71687b10

scala> oos.writeObject(a)
java.io.NotSerializableException: $iwC$$iwC$A

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

scala> iteblog.name
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. 。来看下面的例子:

object TermTest extends scala.App {
  def printTerm(term: Term) {
    term match {
      case Var(n) =>
        print(n)
      case Fun(x, b) =>
        print("^" + x + ".")
        printTerm(b)
      case App(f, v) =>
        print("(")
        printTerm(f)
        print(" ")
        printTerm(v)
        print(")")
    }
  }
  def isIdentityFun(term: Term): Boolean = term match {
    case Fun(x, Var(y)) if x == y => true
    case _ => false
  }
  val id = Fun("x", Var("x"))
  val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))
  printTerm(t)
  println
  println(isIdentityFun(id))
  println(isIdentityFun(t))
}
本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【Scala class和case class的区别】(https://www.iteblog.com/archives/1508.html)
喜欢 (57)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!
(1)个小伙伴在吐槽
  1. 支持模式匹配其实是重写的umapply方法。
    灰太狼2016-12-16 16:11 回复