Scala 中Case Class

上面的理解是http://www.aboutyun.com/thread-23464-1-1.html

下面代码原创是https://blog.csdn.net/yyywyr/article/details/50300303

case class 跟普通class有什么区别

1、初始化的时候,不需要new,当然你也可以加上,普通类一定需要加上new
2、toString的实现更加漂亮
3、默认实现了equals   hashcode
4、默认是可以序列化的,也就是实现了Serializable
5、自动从scala.Producet中继承了一些函数
6、case class构造函数的参数是publiec级别的,我们可以直接访问
7、支持模式匹配
上面其实我们已经明白了case class ,其实就是class,与其它class有所不同。
1、代码示例

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

package com.yy.base 

   

/**

 * case class 示例

 */ 

abstract class Person 

case class Student(name:String,sno:Int) extends Person 

case class Teacher(name:String,tno:Int) extends Person 

case class None(name:String) extends Person 

   

object CaseClassTest extends App { 

    def caseClassMatch(p:Person) = p match

      case Student(name,sno) => println(name + " is a student,sno is:" + sno) 

      case Teacher(name,tno) => println(name + " is a teacher,tno is:" + tno) 

      case None(name) => println("None matched"

    

       

    val p = Student("yy",20151214

    caseClassMatch(p) 

}



2、结果

1

yy is a student,sno is:20151214 


注意,当一个类被生成为case class 时,scala会默认作如下工作:
(1)如果参数不加var/val修改,默认为val。
(2)自动创建伴生对象,实现apply方法,方便了我们在创建对象时不适用new
(3)实现自己的toString、hashCode、copy和equals方法

3、copy等方法介绍

01

02

03

04

05

06

07

08

09

10

11

12

13

14

val t = Teacher("xx",2015)

  println("toString:" + t.toString())

  println("hashCode:" + t.hashCode())

  //深度copy

  val t1 = t.copy()

  println("copy之无参拷贝:" + t1)

  println("copy之无参拷贝t内容是否equals t1:" + t.equals(t1))

  println(t==t1)

  val t2 = t.copy(name="zz")

  println("t2:" + t2.toString())

  val t3 = t.copy(tno=111)

  println("t3:" + t3)

  val t4 = t.copy("ww",222)

  println("t4:" + t4)


结果如下:
 

1

2

3

4

5

6

7

8

toString:Teacher(xx,2015)

hashCode:-1236856524

copy之无参拷贝:Teacher(xx,2015)

copy之无参拷贝t内容是否equals t1:true

true

t2:Teacher(zz,2015)

t3:Teacher(xx,111)

t4:Teacher(ww,222)


4、多个参数的case class

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

package com.yy.base

 

/**

 * case class 多个参数示例

 */

abstract class Person1

case class Student1(name:String,sno:Int) extends Person1

case class Teacher1(name:String,tno:Int) extends Person1

case class None1(name:String) extends Person1

//SchoolPerson包含0或者多个Person类型参数的类

case class SchoolPerson(desc:String, person:Person1*)

 

object CaseClassNestedTest extends App {

    val sp = SchoolPerson("多个Person类型的类",Student1("xx",11),Teacher1("yy",22))

    sp match{

      case SchoolPerson(_,Student1(name,sno),_) => println(name+":"+sno)

      case SchoolPerson(_,_,Teacher1(name,tno)) => println(name+":"+tno)

      case _ => println("NO")

    }

}


结果为

1

xx:11 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值