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中的常用方法
  • 一般也用于模式匹配

    • 样例类在模式匹配的时候是可以直接匹配元素的值

样例类的功能与特点

  • 普通类:所有的方法需要自己手动显示的定义

    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快速入门--样例类的主要内容,如果未能解决你的问题,请参考以下文章

Scala:样例类模式匹配Option偏函数泛型

Scala 学习 -- 样例类和模式匹配

Scala 学习 -- 样例类和模式匹配

介绍Scala的样例类

scala基础语法四(高级)

必会Scala之模式匹配和样例类