日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Scala入门到精通——第十四节 Case Class与模式匹配(一)

發布時間:2024/1/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala入门到精通——第十四节 Case Class与模式匹配(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節主要內容

  • 模式匹配入門
  • Case Class簡介
  • Case Class進階
  • 1. 模式匹配入門

    在Java語言中存在switch語句,例如:

    //下面的代碼演示了java中switch語句的使用 public class SwitchDemo {public static void main(String[] args) {for(int i = 0; i < 100; i++) { switch (i) {case 10:System.out.println("10");break;//在實際編碼時,程序員很容易忽略break語句//這容易導致意外掉入另外一個分支case 50:System.out.println("50");case 80:System.out.println("80");default:break;}}} }

    Scala解決了java語言中存在的這個問題,scala解決這一問題的利器就是模式匹配,上面的java代碼可以利用scala語言的模式匹配來避免,代碼如下:

    object PatternMatching extends App{for(i<- 1 to 100){i match {case 10 => println(10)case 50 => println(50)case 80 => println(80)case _ => }} }

    上述scala代碼展示了如何使用scala中的模式匹配,它的實現方式是通過match關鍵字與 case X=>的方式實現的,其中case _表示除了 case 10,case 50,case 80的其余匹配,類似于java中的default。但scala語言中提供了更為靈活的匹配方式,如:

    object PatternMatching extends App{for(i<- 1 to 100){i match {case 10 => println(10)case 50 => println(50)case 80 => println(80)//增加守衛條件case _ if(i%4==0)=> println(i+":能被4整除")case _ if(i%3==0)=> println(i+":能被3整除")case _ =>}} }

    case語言中還可以加相應的表達式,例如:

    object PatternMatching extends App{var list=new ArrayBuffer[Int]()var x=0for(i<- 1 to 100){i match {//后面可以跟表達式case 10 => x=10case 50 => println(50)case 80 => println(80)case _ if(i%4==0)=> list.append(i)case _ if(i%3==0)=> println(i+":能被3整除")case _ =>}}println(x) }

    2 Case Class簡介

    Case Class一般被翻譯成樣例類,它是一種特殊的類,能夠被優化以用于模式匹配,下面的代碼定義了一個樣例類:

    //抽象類Person abstract class Person//case class Student case class Student(name:String,age:Int,studentNo:Int) extends Person //case class Teacher case class Teacher(name:String,age:Int,teacherNo:Int) extends Person //case class Nobody case class Nobody(name:String) extends Personobject CaseClassDemo{def main(args: Array[String]): Unit = {//case class 會自動生成apply方法,從而省去new操作val p:Person=Student("john",18,1024) //match case 匹配語法 p match {case Student(name,age,studentNo)=>println(name+":"+age+":"+studentNo)case Teacher(name,age,teacherNo)=>println(name+":"+age+":"+teacherNo)case Nobody(name)=>println(name)}} }
    • 1

    當一個類被聲名為case class的時候,scala會幫助我們做下面幾件事情:
    1 構造器中的參數如果不被聲明為var的話,它默認的話是val類型的,但一般不推薦將構造器中的參數聲明為var
    2 自動創建伴生對象,同時在里面給我們實現子apply方法,使得我們在使用的時候可以不直接顯示地new對象
    3 伴生對象中同樣會幫我們實現unapply方法,從而可以將case class應用于模式匹配,關于unapply方法我們在后面的“提取器”那一節會重點講解
    4 實現自己的toString、hashCode、copy、equals方法
    除此之此,case class與其它普通的scala類沒有區別

    下面給出case class Student字節碼文件內容,以驗證我們上述所講的內容:

    //下面的代碼是自動生成的伴生對象中的字節碼內容 D:\ScalaWorkspace\ScalaChapter13\bin\cn\scala\xtwy>javap -private Student$.classCompiled from "CaseClass.scala" public final class cn.scala.xtwy.Student$ extends scala.runtime.AbstractFunction 3<java.lang.String, java.lang.Object, java.lang.Object, cn.scala.xtwy.Student> i mplements scala.Serializable {public static final cn.scala.xtwy.Student$ MODULE$;public static {};public final java.lang.String toString();public cn.scala.xtwy.Student apply(java.lang.String, int, int);public scala.Option<scala.Tuple3<java.lang.String, java.lang.Object, java.lang .Object>> unapply(cn.scala.xtwy.Student);private java.lang.Object readResolve();public java.lang.Object apply(java.lang.Object, java.lang.Object, java.lang.Ob ject);private cn.scala.xtwy.Student$(); }//下面的代碼是Student類自身的字節碼內容 D:\ScalaWorkspace\ScalaChapter13\bin\cn\scala\xtwy>javap -private Student.class Compiled from "CaseClass.scala" public class cn.scala.xtwy.Student extends cn.scala.xtwy.Person implements scala .Product,scala.Serializable {private final java.lang.String name;private final int age;private final int studentNo;public static scala.Function1<scala.Tuple3<java.lang.String, java.lang.Object,java.lang.Object>, cn.scala.xtwy.Student> tupled();public static scala.Function1<java.lang.String, scala.Function1<java.lang.Obje ct, scala.Function1<java.lang.Object, cn.scala.xtwy.Student>>> curried();public java.lang.String name();public int age();public int studentNo();public cn.scala.xtwy.Student copy(java.lang.String, int, int);public java.lang.String copy$default$1();public int copy$default$2();public int copy$default$3();public java.lang.String productPrefix();public int productArity();public java.lang.Object productElement(int);public scala.collection.Iterator<java.lang.Object> productIterator();public boolean canEqual(java.lang.Object);public int hashCode();public java.lang.String toString();public boolean equals(java.lang.Object);public cn.scala.xtwy.Student(java.lang.String, int, int); }

    3. case class應用實戰

    1 case class常用方法
    前面我們提到,定義case class便會自動生成對應的toString,hashCode,equals,copy等方法,

    //toString方法演示 scala> val s=Teacher("john",38,1024) s: Teacher = Teacher(john,38,1024)//無參copy方法演示 scala> val s1=s.copy() s1: Teacher = Teacher(john,38,1024)//copy方法是深度拷貝 scala> println(s eq s1) false//equal方法根據對象內容進行比較 scala> println(s equals s1) truescala> println(s == s1) true//hashcode方法 scala> s1.hashCode res45: Int = 567742485//toString方法 scala> s1.toString res46: String = Teacher(john,38,1024)//帶一個參數的copy方法 scala> s1.copy(name="stephen") res47: Teacher = Teacher(stephen,38,1024) //帶二個參數的copy方法 scala> s1.copy(name="stephen",age=58) res49: Teacher = Teacher(stephen,58,1024) //帶三個參數的copy方法 scala> s1.copy(name="stephen",age=58,teacherNo=2015) res50: Teacher = Teacher(stephen,58,2015)

    2 多個參數的case class

    abstract class Personcase class Student( name:String, age:Int, studentNo:Int) extends Personcase class Teacher( name:String, age:Int, teacherNo:Int) extends Personcase class Nobody( name:String) extends Person//SchoolClass為接受多個Person類型參數的類 case class SchoolClass(classDescription:String,persons:Person*)//下列代碼給出的是其模式匹配應用示例 object CaseClassDemo{def main(args: Array[String]): Unit = {val sc=SchoolClass("學途無憂網Scala培訓班",Teacher("搖擺少年夢",27,2015),Student("搖擺少年夢",27,2015))sc match{case SchoolClass(_,_,Student(name,age,studetNo))=>println(name)case _ => println("Nobody")}} }

    3 sealed case class

    在進行模式匹配的時候,有些時候需要確保所有的可能情況都被列出,此時常常會將case class的超類定義為sealed(密封的) case class,如:

    //Person最前面加了個關鍵字sealed sealed abstract class Personcase class Student( name:String, age:Int, studentNo:Int) extends Personcase class Teacher( name:String, age:Int, teacherNo:Int) extends Personcase class Nobody( name:String) extends Personcase class SchoolClass(classDescription:String,persons:Person*)object CaseClassDemo{def main(args: Array[String]): Unit = {val s:Person=Student("john",18,1024)//這邊僅僅給出了匹配Student的情況,在編譯時//編譯器會提示//match may not be exhaustive. It would fail on the following inputs: Nobody(_), Teacher(_, _, _)s match{case Student(name,age,studentNo)=>println("Student")}} }

    編譯器給出的提示可以通過下列語句進行消除,

    //下面的語句達到了sealed class的要求val s:Person=Student("john",18,1024)s match{case Student(name,age,studentNo)=>println("Student")case Teacher(name,age,studentNo)=>println("Teacher")case Nobody(name)=>println("Nobody")}

    4 case class在實用應用中的其它用途
    某個類一旦被定義為case class,則編譯器會自動生成該類的伴生對象,伴生對象中包括了apply方法及unapply方法,apply方法使得我們可以不需要new關鍵字就可以創建對象,而unapply方法,則使得可以方便地應用在模式匹配當中,另外編譯器還自動地幫我們實現對應的toString、equals、copy等方法。在實際中,case class除了在模式匹配時能發揮其強大的威力之外,在進行其它應用時,也顯示出了其強大的功能,下面給出case class在SparkSQL中的應用,旨在說明case class在實際應用中的重要地位。

    總結

    以上是生活随笔為你收集整理的Scala入门到精通——第十四节 Case Class与模式匹配(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日本中文字幕有码 | 一级片aaaaa 国产又黄又粗又猛又爽 | 国产v亚洲v天堂无码久久久 | av中文在线观看 | 女同性69囗交 | 成人h动漫精品一区二区器材 | 中国av一区 | 性做久久久久久免费观看 | 99视频精品在线 | 色一区二区| 欧美日韩成人在线播放 | 国产av剧情一区二区三区 | 国产一区不卡视频 | 婷婷在线视频观看 | 字幕网av| 尤物影院在线观看 | 亚洲免费区 | 欧美日韩123区 | 成人动漫一区二区 | 未满十八18禁止免费无码网站 | 一级二级三级视频 | 一级欧美一级日韩片 | 精品资源成人 | 欧美日韩中文字幕视频 | 丝袜熟女一区二区三区 | 麻豆网站免费看 | 亚洲专区一区二区三区 | 一级伦理片| 国产成人免费在线观看 | 制服丝袜亚洲 | 中文人妻熟女乱又乱精品 | 免费在线观看av | 中文字幕在线播放一区 | 亚洲一区二区视频在线观看 | 日韩在线亚洲 | 日本不卡专区 | 亚洲琪琪 | 不用播放器av | 亚洲免费观看高清在线观看 | 国产一区h| 午夜888| 国产精品啪啪啪视频 | 亚州精品国产精品乱码不99按摩 | a级大片在线观看 | 91久色蝌蚪| 亚洲一区二区在线视频 | 婷婷国产视频 | 亚洲激情网站 | 久久免费精品 | 91国自产精品中文字幕亚洲 | 日日干日日插 | 光棍福利视频 | 亚洲欧美在线视频观看 | 口爆吞精一区二区三区 | 国产精品自拍视频 | 亚洲欧洲成人 | 青青青视频免费观看 | 久久tv| 日韩欧美一区视频 | 国产欧美亚洲一区 | 日韩免费看 | 欧洲自拍偷拍 | 91片黄在线观看喷潮 | 91大神精品在线 | 国产精品一区二区人人爽 | 国产女厕一区二区三区在线视 | 色悠悠久久综合 | 亚洲人妻一区二区三区 | 欧美色悠悠 | 黄色日批| 欧美日韩网 | 欧美性猛交一区二区三区精品 | 一区二区三区精品视频在线观看 | 日本孰妇毛茸茸xxxx | 久久久精品动漫 | 求av网址| 日韩三级免费观看 | 精品福利三区3d卡通动漫 | 亚洲精品久久久久久 | 被各种性器调教到哭vk | 朴银狐电影中文在线看 | 免费成人av | 成年人免费网站在线观看 | 少妇免费直播 | 亚洲精品一区二区三区四区五区 | 日本三级网站在线观看 | 艳母免费在线观看 | 午夜精品视频 | 日韩1区2区3区 | 日本在线免费看 | 亚洲小视频在线 | 亚洲欧美日韩精品在线 | 偷拍xxxx | 伊人久久青青 | 亚洲色图 美腿丝袜 | 草逼视频网 | 日韩午夜免费 | 一级特级片 | 手机看片福利一区 |