2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)
目錄
提取器(Extractor)?
定義提取器
提取器(Extractor)?
我們之前已經(jīng)使用過(guò)scala中非常強(qiáng)大的模式匹配功能了,通過(guò)模式匹配,我們可以快速匹配樣例類中的成員變量。例如:
// 定義樣例類
case?class?SubmitTask(id:?String,?name:?String)
case?class?HeartBeat(time:?Long)
case?object?CheckTimeOutTaskval?msg1 =?SubmitTask("001",?"task-001")
val?msg2 =?HeartBeat(1000)
val?msg3 =?CheckTimeOutTaskval?list =?List(msg1,?msg2,?msg3)list(2)?match?{// 可以使用模式匹配快速匹配到到SubmitTask樣例類中的id和namecase?SubmitTask(id,?name)?=>?println(s"id=$id, name=$name")case?HeartBeat(time)?=>?println(s"time=$time")case?CheckTimeOutTask =>?println("檢查超時(shí)")
}
那是不是所有的類都可以進(jìn)行這樣的模式匹配呢?答案是不可以的。要支持模式匹配,必須要實(shí)現(xiàn)一個(gè)提取器。
?
定義提取器
之前我們學(xué)習(xí)過(guò)了,實(shí)現(xiàn)一個(gè)類的伴生對(duì)象中的apply方法,可以用類名來(lái)快速構(gòu)建一個(gè)對(duì)象。伴生對(duì)象中,還有一個(gè)unapply方法。與apply相反,unapply是將該類的對(duì)象,拆解為一個(gè)個(gè)的元素。
要實(shí)現(xiàn)一個(gè)類的提取器,只需要在該類的伴生對(duì)象中實(shí)現(xiàn)一個(gè)unapply方法即可。
示例:實(shí)現(xiàn)一個(gè)類的解構(gòu)器,并使用match表達(dá)式進(jìn)行模式匹配,提取類中的字段。
class?Student {var?name:String =?_ ??// 姓名var?age:Int?=?_ ??????// 年齡// 實(shí)現(xiàn)一個(gè)輔助構(gòu)造器def?this(name:String,?age:Int)?=?{this()this.name =?namethis.age =?age}
}object?Student {def?apply(name:String,?age:Int):?Student =?new?Student(name,?age)// 實(shí)現(xiàn)一個(gè)解構(gòu)器def?unapply(arg:?Student):?Option[(String,?Int)]?=?Some((arg.name,?arg.age))
}object?extractor_DEMO {def?main(args:?Array[String]):?Unit?=?{val?zhangsan =?Student("張三",?20)zhangsan match?{case?Student(name,?age)?=>?println(s"姓名:$name?年齡:$age")case?_ =>?println("未匹配")}}
}
樣例類自動(dòng)實(shí)現(xiàn)了apply、unapply方法(可以使用scalap反編譯一個(gè)樣例類的字節(jié)碼)
?
總結(jié)
以上是生活随笔為你收集整理的2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2021年大数据常用语言Scala(三十
- 下一篇: 2021年大数据常用语言Scala(三十