1.样例类
1.样例类
case class 旨在创建的是不可变数据
类被定义成为case类后-称之为样例类
Scala会自动帮你创建一个伴生对象
并默认自动实现了一系列方法
01.实现了apply方法,意味着你不需要使用new关键字就能创建该类对象
02.实现了unapply方法,可以通过模式匹配来获取类属性,是Scala中抽取器的实现和模式匹配的关键方法。
03.实现了类构造参数的getter方法(构造参数默认被声明为val),
当构造参数是声明为var类型的,它将帮你实现setter和getter方法(不建议将构造参数声明为var)
04.样本类参数列表中的所有参数隐式获得了val前缀,因此它被当作字段维护。
05.编译器为这个类添加了方法toString,hashCode和equals等方法
案例--参考课程
/** A raw stackoverflow posting, either a question or an answer */
case class Posting(postingType: Int, id: Int, acceptedAnswer: Option[Int], parentId: Option[Int], score: Int, tags: Option[String]) extends Serializable
/** Load postings from the given file */
def rawPostings(lines: RDD[String]): RDD[Posting] =
lines.map(line => {
val arr = line.split(",")
Posting(
postingType = arr(0).toInt,
id = arr(1).toInt,
acceptedAnswer = if (arr(2) == "") None else Some(arr(2).toInt),
parentId = if (arr(3) == "") None else Some(arr(3).toInt),
score = arr(4).toInt,
tags = if (arr.length >= 6) Some(arr(5).intern()) else None)
})
关于case class
case class,它其实就是一个普通的class。但是它又和普通的class略有区别。不可变类中的一种简单类型,内置了所有JAVA类的基本方法,比如以下中的2.3。
提供factory method来方便构造object、class parameter隐含val prefix
>1、初始化的时候普通类一定需要加new,case calss 可以不用new,当然你也可以加上。
>2、toString的实现更漂亮
>3、默认实现了equals 和hashCode
>4、默认是可以序列化的,也就是实现了Serializable
>5、自动从scala.Product中继承一些函数;
>6、case class构造函数的参数是public级别的,我们可以直接访问
>7、支持模式匹配,case class最重要的特性应该就是支持模式匹配。
参考: 样例类case详解 http://www.bitscn.com/cloud/776801.html Scala class和case class的区别 https://www.iteblog.com/archives/1508.html 案例代码-https://github.com/amirziai/big-data-scala-spark/blob/master/stackoverflow/src/main/scala/stackoverflow/StackOverflow.scala