Scala样例类

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

blogroll

social