第42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用
第42讲是进阶阶段第一讲
1-41是入门经典,学习了scala的基本类型,面向对象编程,函数式编程和
集合的操作,模式匹配。
只有从第42讲开始才会充分体会到scala的丰富和强大魅力。
进阶阶段中的每一讲都会讲在spark中的应用。
spark中scala最成功的应用
1巩固学习内容,
2开阔视野
3spark是大数据处理最重要的平台,可以看到scala如何在spark中的应用。
对后续学习spark非常重要。
实战代码:
class Triple[F,S,T](val first:F, val Secod: S, val third: T)
//声明时并没有说明三个参数是什么类型。
sealed abstract class List[+A] extends AbstractSeq[A]
//+A是一个没有具体的类型,定义时A的类型不确定,使用时才定义。
//A:Any,类要想变成泛型,需要在后面加一个[],
//继承抽象类,
with LinearSeq[A]
with Product
with GenericTraverSableTemplate[A, List]
with LinearSeqOptimized[A, List[A]] {
val triple = new Triple("Spark",3,3.1415)
val bigData = new Triple[String,String,Char]("Spark","Hadoop",'R')
def getData[T](list : List[T]) = list(list.length / 2)
println(getData(List("Spark","Hadoop",'R')))
val f = getData[Int] _
println(f(List(1,2,3,4,5,6,7,8)))
}
object Hello_Type_Parameterization {
def main(args:Array[String]){
val triple = new Triple("Spark",3,3.1415)
//可以指定也可以不指定类型。scala可以推断参数的类型。
val bigData = new Triple[String,String,Char]("Spark","Hadoop",'R')
//强制约束了F:String,S:String,T:Char
def getData[T](list : List[T]) = list(list.length / 2)
//方法的泛型
println(getData(List("Spark","Hadoop",'R')))
val f = getData[Int] _
//输入是整数类型的List,
println(f(List(1,2,3,4,5,6,7,8)))
def foo[A, B](f: A => List[A],b: A) = f(b)
//之所以可以这样定义是因为函数是一等成员。
//b必须是A类型,不能随便定义为B类型
}
}
类型推断非常重要,可以通过非常高明的类型推断和隐式转换可 以构建非常简洁表达力非常强大的函数。
本讲代码运行结果:
scala官网对ClassTag的讲解:
A ClassTag[T] stores the erased class of a given type T, accessible via the runtimeClass field. This is particularly useful for instantiating Arrays whose element types are unknown at compile time.
ClassTags are a weaker special case of scala.reflect.api.TypeTags#TypeTags, in that they wrap only the runtime class of a given type, whereas a TypeTag contains all static type information. That is, ClassTags are constructed from knowing only the top-level class of a type, without necessarily knowing all of its argument types. This runtime information is enough for runtime Array creation.
For example:
scala> def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
scala> mkArray(42, 13)
res0: Array[Int] = Array(42, 13)
scala> mkArray("Japan","Brazil","Germany")
res1: Array[String] = Array(Japan, Brazil, Germany)
See scala.reflect.api.TypeTags for more examples, or the Reflection Guide: TypeTags for more details.
Annotations
@implicitNotFound( msg = "No ClassTag available for ${T}" )
Source
ClassTag.scala
以上内容是从王家林老师DT大数据课程第42讲的学习笔记。
DT大数据微信公众账号:DT_Spark
王家林老师QQ:1740415547
王家林老师微信号:18610086859
scala第42讲视频观看链接:
http://yun.baidu.com/s/1sjsmSXZ
我的百度网盘共享的DT大数据梦工厂王家林老师第1-77讲的视频内容:http://pan.baidu.com/s/1qWK9CMo