美文网首页
Scala:样例类(case classes)

Scala:样例类(case classes)

作者: 泡泡坪 | 来源:发表于2018-12-10 14:32 被阅读3次

    1.概念理解

    使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,它将帮你实现setter和getter方法。
    样例类默认帮你实现了toString,equals,copy和hashCode等方法。
    样例类可以new, 也可以不用new

    2.简单实例

    object Test {
       def main(args: Array[String]) {
           val alice = new Person("Alice", 25)
        val bob = new Person("Bob", 32)
           val charlie = new Person("Charlie", 32)
       
        for (person <- List(alice, bob, charlie)) {
            person match {
                case Person("Alice", 25) => println("Hi Alice!")
                case Person("Bob", 32) => println("Hi Bob!")
                case Person(name, age) =>
                   println("Age: " + age + " year, name: " + name + "?")
             }
          }
       }
       // 样例类
       case class Person(name: String, age: Int)
    }
    

    执行以上代码,输出结果为:

    Hi Alice!
    Hi Bob!
    Age: 32 year, name: Charlie?
    

    在声明样例类时,下面的过程自动发生了:

    • 构造器的每个参数都成为val,除非显式被声明为var,但是并不推荐这么做;
    • 在伴生对象中提供了apply方法,所以可以不使用new关键字就可构建对象;
    • 提供unapply方法使模式匹配可以工作;
    • 生成toString、equals、hashCode和copy方法,除非显示给出这些方法的定义。

    3.例子:结合模式匹配的代码

    case class Person1(name:String,age:Int)
    
    object Lesson_CaseClass {
      def main(args: Array[String]): Unit = {
        val p1 = new Person1("zhangsan",10)
        val p2 = Person1("lisi",20)
        val p3 = Person1("wangwu",30)
        
        val list = List(p1,p2,p3)
        list.foreach { x => {
          x match {
            case Person1("zhangsan",10) => println("zhangsan")
            case Person1("lisi",20) => println("lisi")
            case _ => println("no match")
          }
        } }
        
      }
    }
    

    相关文章

      网友评论

          本文标题:Scala:样例类(case classes)

          本文链接:https://www.haomeiwen.com/subject/gswrhqtx.html