第42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用学习笔记

42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用

 

42讲是进阶阶段第一讲

1-41是入门经典,学习了scala的基本类型,面向对象编程,函数式编程和

集合的操作,模式匹配。

只有从第42讲开始才会充分体会到scala的丰富和强大魅力。

进阶阶段中的每一讲都会讲在spark中的应用。

sparkscala最成功的应用

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的类型不确定,使用时才定义。

//AAny,类要想变成泛型,需要在后面加一个[]

//继承抽象类,

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
scala42讲视频观看链接:
http://yun.baidu.com/s/1sjsmSXZ
我的百度网盘共享的DT大数据梦工厂王家林老师第1-77讲的视频内容:http://pan.baidu.com/s/1qWK9CMo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值