2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)
生活随笔
收集整理的這篇文章主要介紹了
2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
提取器(Extractor)?
定義提取器
提取器(Extractor)?
我們之前已經使用過scala中非常強大的模式匹配功能了,通過模式匹配,我們可以快速匹配樣例類中的成員變量。例如:
// 定義樣例類
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("檢查超時")
}
那是不是所有的類都可以進行這樣的模式匹配呢?答案是不可以的。要支持模式匹配,必須要實現一個提取器。
?
定義提取器
之前我們學習過了,實現一個類的伴生對象中的apply方法,可以用類名來快速構建一個對象。伴生對象中,還有一個unapply方法。與apply相反,unapply是將該類的對象,拆解為一個個的元素。
要實現一個類的提取器,只需要在該類的伴生對象中實現一個unapply方法即可。
示例:實現一個類的解構器,并使用match表達式進行模式匹配,提取類中的字段。
class?Student {var?name:String =?_ ??// 姓名var?age:Int?=?_ ??????// 年齡// 實現一個輔助構造器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)// 實現一個解構器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("未匹配")}}
}
樣例類自動實現了apply、unapply方法(可以使用scalap反編譯一個樣例類的字節碼)
?
總結
以上是生活随笔為你收集整理的2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据常用语言Scala(三十
- 下一篇: 2021年大数据常用语言Scala(三十