您的位置:首页 > 大数据

大数据系列修炼-Scala课程41

2016-09-22 10:01 330 查看
大数据系列修炼-Scala课程41

核心内容:

1、List继承体系实现内幕和方法操作源码揭秘

1、List继承体系实现内幕和方法操作源码揭秘
在Scala集合内部中的很多实现将涉及到Scala中非常重要的一些特性,这些特性与Java有很大的不同,具体表现为:

1>List本身是一个抽象类,而抽象类不能定义出抽象类的实例对象,实际上我们使用的是List的Object伴生对象,即伴生对象的

apply方法来进行实例化的。

实例源码1:

object List extends SeqFactory[List] {
/** $genericCanBuildFromInfo */
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, List[A]] =
ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]

def newBuilder[A]: Builder[A, List[A]] = new ListBuffer[A]

override def empty[A]: List[A] = Nil

override def apply[A](xs: A*): List[A] = xs.toList


从最后一行源码中我们可以发现,伴生对象中的apply方法返回的是一个List对象

2>List作为一个抽象类,其具体实现的子类是case object Nil与case class ::,并且这两个子类会实现List中相应的抽想方法,

其中Nil代表空的List、::代表非空的List。非空的List有两部分构成:head部分与tail部分。

实例源码2:

case object Nil extends List[Nothing] {
override def isEmpty = true
override def head: Nothing =
throw new NoSuchElementException("head of empty list")
override def tail: List[Nothing] =
throw new UnsupportedOperationException("tail of empty list")
// Removal of equals method here might lead to an infinite recursion similar to IntMap.equals.
override def equals(that: Any) = that match {
case that1: scala.collection.GenSeq[_] => that1.isEmpty
case _ => false
}
}

final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}


3>List这个抽象类被sealed关键字所修饰,而sealed关键字主要用在模式匹配中,因此List中的很多子类往往都是和模式匹配一起使用的,

并且在模式匹配的时候常用case class与case object来进行模式匹配,因为case class与case object含有scala语言的Extractor机制,

可以方便的提取出变量的内容。

实例源码3:

sealed abstract class List[+A] extends AbstractSeq[A]
with LinearSeq[A]
with Product
with GenericTraversableTemplate[A, List]
with LinearSeqOptimized[A, List[A]]
with Serializable


相实的实例程序:

sealed abstract class Persion  //定义了一个类:抽象类 相当于我们的List
{
def fun();//定义一个抽象方法 相当于List中的抽象方法
}
case class Student(age:Int) extends Persion
{
def fun() = println("AAAAA")
}
case class Worker(age:Int,salary:Double) extends Persion  //定义了一个类,继承了抽象类 相当于::
{
def fun() = println("BBBBB")
}
case object Shared extends Persion //定义了一个Object  相当于Nil
{
def fun() = println("CCCCC")
}

object App6
{
def main(args:Array[String]):Unit=
{
def fun(persion:Persion) = persion match
{
case Student(age) => println("age is:"+age)
case Worker(age,salary) => println("age is:"+age+"salary is:"+salary)
case Shared => println("Object")
case _ => println("nothing!")
}
}
}


4>在List集合中,head、tail、isEmpty实际上是List中相应的方法,因此我们调用的实际上是方法,不是属性

相应程序:
object App8
{
def main(args:Array[String]):Unit=
{
val list = List(10,20,30,40,50)
println(list.isEmpty)
println(list.head)
println(list.tail)
}
}

相应源码:
override def tail : List[B] = tl
override def isEmpty: Boolean = false


如有问题,欢饮留言指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: