大数据系列修炼-Scala课程41
2016-09-22 10:01
330 查看
大数据系列修炼-Scala课程41
核心内容:
1、List继承体系实现内幕和方法操作源码揭秘
在Scala集合内部中的很多实现将涉及到Scala中非常重要的一些特性,这些特性与Java有很大的不同,具体表现为:
1>List本身是一个抽象类,而抽象类不能定义出抽象类的实例对象,实际上我们使用的是List的Object伴生对象,即伴生对象的
apply方法来进行实例化的。
实例源码1:
从最后一行源码中我们可以发现,伴生对象中的apply方法返回的是一个List对象
2>List作为一个抽象类,其具体实现的子类是case object Nil与case class ::,并且这两个子类会实现List中相应的抽想方法,
其中Nil代表空的List、::代表非空的List。非空的List有两部分构成:head部分与tail部分。
实例源码2:
3>List这个抽象类被sealed关键字所修饰,而sealed关键字主要用在模式匹配中,因此List中的很多子类往往都是和模式匹配一起使用的,
并且在模式匹配的时候常用case class与case object来进行模式匹配,因为case class与case object含有scala语言的Extractor机制,
可以方便的提取出变量的内容。
实例源码3:
相实的实例程序:
4>在List集合中,head、tail、isEmpty实际上是List中相应的方法,因此我们调用的实际上是方法,不是属性
如有问题,欢饮留言指正!
核心内容:
1、List继承体系实现内幕和方法操作源码揭秘
1、List继承体系实现内幕和方法操作源码揭秘 |
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
如有问题,欢饮留言指正!
相关文章推荐
- 大数据系列修炼-Scala课程06
- 大数据系列修炼-Scala课程34
- 大数据系列修炼-Scala课程88
- 大数据系列修炼-Scala课程13+14
- 大数据系列修炼-Scala课程25
- 大数据系列修炼-Scala课程74
- 大数据系列修炼-Scala课程77
- 大数据系列修炼-Scala课程80
- 大数据系列修炼-Scala课程07
- 大数据系列修炼-Scala课程07
- 大数据系列修炼-Scala课程22
- 大数据系列修炼-Scala课程29
- 大数据系列修炼-Scala课程39
- 大数据系列修炼-Scala课程78
- 大数据系列修炼-Scala课程83
- 大数据系列修炼-Scala课程96(1)
- 大数据系列修炼-Scala课程23
- 大数据系列修炼-Scala课程30
- 大数据系列修炼-Scala课程40
- 大数据系列修炼-Scala课程76