Scala快速入门--样例类
Posted 一只楠喃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala快速入门--样例类相关的知识,希望对你有一定的参考价值。
Scala样例类
样例类:功能特点
样例类的设计
-
Scala中一种特殊的类,通过关键字标识:case
-
正常的类
class Name
-
样例类
case class Name
-
-
可以用封装数据,类似于Java中构建的JavaBean或者POJO类设计
- JavaBean
- 成员属性
- construct
- get and set
- toString
- hashCode and equals
- Scala:叫做Scala Bean
- Scala中Tuple的设计就是利用样例类来实现存储数据
- 优点在于:自动实现Bean中的常用方法
- JavaBean
-
一般也用于模式匹配
- 样例类在模式匹配的时候是可以直接匹配元素的值
样例类的功能与特点
-
普通类:所有的方法需要自己手动显示的定义
class Person06(var name:String){ // override def toString: String = this.name //重写hashcode进行比较,以name实现,只要name对应的hashcode一样,认为是一样的 //注意:name如果不一样,但是hash是可能一样的 override def hashCode(): Int = super.hashCode() //如果hashcode一样,通过equals来比较值 override def equals(obj: Any): Boolean = super.equals(obj) } object TestPerson06{ def main(args: Array[String]): Unit = { val p1 = new Person06("itcast") //没有定义apply,必须给new关键字 val p2 = new Person06("itcast") //打印:调用toString println(p1) println(p2) //实现两个对象的比较 println(p1 == p2) } }
-
样例类:自动构建伴生对象,自动实现重写了以下方法
case class Person08(var name:String) { } object TestPerson08{ def main(args: Array[String]): Unit = { //构建实例:自动生成伴生对象,实现apply方法 val p1 = Person08("itcast") val p2 = Person08("itcast") //打印:调用toString,自动实现了toString // println(p1) //比较:只要name相同,就认为相同,自动实现了hashcode和equals println(p1 == p2) } }
-
apply:样例类自动构建伴生对象,自动生成apply
- 普通类,必须自己定义伴生对象和实现apply
- 将传递的属性给你返回对象
-
toString:样例类自动重写
- 普通类:手动重写
-
hashCode and equals:样例类自动重写
- 普通类:手动重写
-
copy:直接复制一个样例类的对象
val p3 = p2.copy("heima")
-
unapply:提取器
- 用于将样例类实现模式匹配
- 从传递的对象中提取属性
-
样例类:结合模式匹配
(模式匹配参考上一次的Scala的模式匹配讲解嗷)
-
实现样例类的模式匹配
-
样例类与普通类模式匹配的区别
-
普通类:匹配类的类型,然后传递给对象,通过对象获取类的属性
-
样例类:直接匹配类的属性,然后复制给属性变量
-
unapply方法与提取器
unapply的功能**
-
apply的功能:传递属性,返回实例对象,当构建实例的时候,可以不写new
-
unapply的功能:传递对象,返回对象中的属性,实现模式匹配的时候,直接匹配属性的值
unapply的定义及使用
case class Dog(var name:String,var age:Int)
class Cat(var name:String,var age:Int)
object UnapplyDemo {
def main(args: Array[String]): Unit = {
val arr = Array(Dog("wangwang",5),new Cat("tom",8))
val input = arr(Random.nextInt(arr.length))
input match {
case Dog(name,age) => println(s"this is a dog name =${name} age = ${age}" )
case cat:Cat => println(s"this is a cat name =${cat.name} age = ${cat.age}" )
}
}
}
- 如果实现可以不写new关键字?
- 如何实现可以进行样例匹配?
case class Dog(var name:String,var age:Int)
class Cat(var name:String,var age:Int)
object Cat{
//传递参数,返回对象
def apply(name:String,age:Int) = new Cat(name,age)
//传递对象,返回参数
def unapply(cat: Cat): Option[(String, Int)] = {
//判断对象是否为空
if(cat != null){
Some((cat.name,cat.age))
}else{
None
}
}
}
object UnapplyDemo {
def main(args: Array[String]): Unit = {
//问题1:如何能让Cat在构建实例的时候,不写new
val arr = Array(Dog("wangwang",5),Cat("tom",8))
val input = arr(Random.nextInt(arr.length))
input match {
case Dog(name,age) => println(s"this is a dog name =${name} age = ${age}" )
//问题2:如何能让Cat在模式匹配时直接匹配属性
case Cat(name,age) => println(s"this is a cat name =${name} age = ${age}" )
}
}
}
点个赞嘛!
以上是关于Scala快速入门--样例类的主要内容,如果未能解决你的问题,请参考以下文章