提取器
这知识感觉多数跟case class配合使用,但是在与case class配合使用时就算不知道后面的工作机制也没什么关系,会用就行。
其实有必要的话可以自己写提取器,而什么时候用提取器,怎么提高数据传输效率才是难点 :(
直接上代码,加上个人理解
package com.dt.scala.moguyun
/**
* 提取器
* unapply
* 看两点:
* 1 类有没有unapply方法
* 2 unapply方法里传的参数是不是右边的
* 即可调用
* Created by hlf on 2016/8/11.
*/
case class Person1(name: String, age: Int) {
val content = name
}
case class Person2(name: String, age: Int, salary: Int) {
}
/**
* 新建类,里面有apply和unapply方法
*/
class DTCoder(val name: String, val salary: Int)
object DTCoder {
def apply(name: String, salary: Int) = {
println("DTCoder apply methode invoked !!!")
new DTCoder(name, salary)
}
def unapply(information: DTCoder) = {
Some((information.name, information.salary))
/*
//少见,基本都是传入一个对象
def unapply(information:String)= {
Some((information.substring(0,information.indexOf(" ")),information.substring(0,information.indexOf(" ")+1)))
}
*/
}
}
object HelloExtractor {
def main(args: Array[String]): Unit = {
//case class会自动生成apply和unapply方法,所以不用new,
//Person1("spark", 6)与下面的是一样的
val person = Person1.apply("spark", 6)
//将person用unapply提取出name,age赋值给另一个case class
//赋值给同类型的case class
val Person1(name1, age1) = person
//赋值给不同类型的case class
// val Person2(name2, age2) = person//运行时报错,说要求是Person1才行
println("person1" + name1 + " : " + age1)
// println("person2" +name2 + " : " + age2)
person match {
case Person1(name, age) => println("wow " + name + " : " + age)
}
val dtcoder = DTCoder("hadoop", 200)
println(dtcoder.name + ": " + dtcoder.salary)
//像这种用提取器提取出来再赋值给同一个类型对象有意思吗?还不如用上面的dtcoder.name点出来呢 -_-!
val DTCoder(dtname1, dtsalary1) = dtcoder
println("dtname1 " + dtname1 + " : " + dtsalary1)
/*
val DTCoder(dtname,dtsalary) = "spark 100"
println("dtname "+dtname+ " : " +dtsalary)
*/
//从字符串通过提取器构建出一个类,在网络传输时能大大提高性能,这是一个思考方向。
}
}
结果
person1spark : 6
wow spark : 6
DTCoder apply methode invoked !!!
hadoop: 200
dtname1 hadoop : 200
以上内容来自[DT大数据梦工厂]首席专家Spark专家王家林老师的课程分享。感谢王老师的分享,更多精彩内容请扫描关注[DT大数据梦工厂]微信公众号DT_Spark