Scala的Seq实现的初步分析
对于Scala Seq集合
有常见操作:
val platformTypes = Seq("ANDROID", "IOS", "WEB")
该Seq类型在顶级包scala中被定义:
type Seq[+A] = scala.collection.Seq[A]
val Seq = scala.collection.Seq
查看Seq源码,实际Seq本身的定义是非常简单的,且Scala的所有集合基本都是一个类似的使用模板的实现结构
trait Seq[+A] extends PartialFunction[Int, A] //支持偏函数with Iterable[A]//支持迭代器with GenSeq[A]//可并行操作的所有序列的共同特质with GenericTraversableTemplate[A, Seq]//常规集合类的伴随对象的模板特质,代表一种无约束的更高等级的类型with SeqLike[A, Seq[A]] {//Seq[A]的模板特质,Seq主要操作的实现//构建该类的实例的工厂伴生对象//指定伴生对象,实际Seq()是调用的GenericCompanion的apply()方法override def companion: GenericCompanion[Seq] = Seq//类型override def seq: Seq[A] = this
}/** * 类似工厂方法,Coll的当前默认实现是List* @define coll sequence* @define Coll `Seq`*/
object Seq extends SeqFactory[Seq] {//SeqFactory是Seq及其子类的伴生对象模板,仅有unapplySeq方法在模式匹配{case Seq(…)=>}中调用/**GenTraversableFactory是Traversable及其子类的伴随对象的模板。此类提供了一组用于创建$Coll对象的操作。它通常由Traversable子类的伴随对象继承。当然这里是间接的*///每个集合的伴生对象都定义了隐式方法canBuildFromimplicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]//Seq的构造器,默认使用的是不可变的Seq(使用构造器生成一个Seq)def newBuilder[A]: Builder[A, Seq[A]] = immutable.Seq.newBuilder[A]//然而最底层实现其实是一个可变的ListBuffer(继承了Builder特质)
}/** Explicit instantiation of the `Seq` trait to reduce class file size in subclasses. */
abstract class AbstractSeq[+A] extends AbstractIterable[A] with Seq[A]
canBuildFrom在转化集合时(如 toList)会自动引入(因为在伴生对象域内的隐式方法都会自动对本类型的实例可见)
最终调用CanBuildFrom的apply()方法构造一个对应的builder(该builder就是上面ReusableCBF返回的子类的newBuilder方法实现,也就是immutable.Seq.newBuilder[A])
def to[Col[_]](implicit cbf: CanBuildFrom[Nothing, A, Col[A @uV]]): Col[A @uV] = {val b = cbf()b ++= seqb.result()
}
newBuilder不仅在集合转化中实现,使用伴生对象创建Seq实例时newBuilder方法也会被调用。在调用本Seq的伴生对象时会调用GenericCompanion的apply来使用
abstract class GenericCompanion[+CC[X] <: GenTraversable[X]] {/** The underlying collection type with unknown element type */protected[this] type Coll = CC[_]def newBuilder[A]: Builder[A, CC[A]]def empty[A]: CC[A] = newBuilder[A].result()//使用Seq中的定义def newBuilder[A]: Builder[A, Seq[A]] = immutable.Seq.newBuilder[A]实现来生成Seq对象实例def apply[A](elems: A*): CC[A] = {if (elems.isEmpty) empty[A]else {val b = newBuilder[A]//使用builder存储元素,并返回结果b ++= elemsb.result()}}
}
几乎所有集合的具体实现都在*Like中实现。这是一种作为通用模板的特质,Seq集合对应的是SeqLike。
其中SeqLike的方法indexOfSlice、lastIndexOfSlice、indexOf等都使用了kmp算法查找。
鉴于好多人还在CSDN,再冒个泡。原文 https://dreamylost.cn/。不定时搬运自己的博客到这里来
Scala的Seq实现的初步分析相关推荐
- 蛋白质芯片查找与GEO2R进行初步分析
1.蛋白质芯片查找 GEO网站:https://www.ncbi.nlm.nih.gov/gds 检索词:Pancreatic cancer;Protein profiling by protein ...
- Azure底层架构的初步分析
之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...
- linux内核的I2C子系统详解3——i2c-core.c初步分析、I2C总线的匹配机制
以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 5.i2c-core.c初步分析 (1)smbus代码略过:smbus是基于I2C总线发展出来的. (2)模块加载和卸 ...
- 驱动框架2——内核驱动框架中LED的基本情况、初步分析
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.内核驱动框架中LED的基本情况 1.相关文件 (1)drivers/leds目录 驱动框架规定的LED这种硬件的驱动应该待的地方. (2 ...
- 【2017年第3期】大数据服务三农的初步分析与探索
孙忠富, 褚金翔, 马浚诚, 杜克明, 郑飞翔 中国农业科学院农业环境与可持续发展研究所,北京 100081 摘要:三农问题是当前中国密切关注的社会问题,大数据技术的发展为三农带来了新的机遇.首先,对 ...
- tomcat4 请求的处理——初步分析
tomcat4 请求的处理--初步分析 以tomcat4为例, 每当HttpConnector的ServerSocket得到客户端的连接时,会创建一个Socket. 接下来就处理这个Socket发来的 ...
- DirectUI的初步分析-转
DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是 ...
- 2017 Python 问卷调查结果初步分析
Note:本文在我的个人站点同步发布:2017 Python 问卷调查结果初步分析 · Lee's Space Station,无广告,体验更好. 未经授权,禁止转载. 前言 2017 年末,PSF( ...
- 基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗
基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗 1. 2022高考数学全国卷I概率题 2. 卡方(χ2\chi^2χ2)检验原理回顾 3. 解答2022高考数学全国卷I概率题 4. 上 ...
最新文章
- Koa 本地搭建 HTTPS 环境
- Httpservlet cannot be resolved to a type的原因与解决方法
- 【python教程】IO文件操作的常见用法
- Active Directory备份与还原
- BZOJ3707 圈地
- 魔百盒服务器响应超时,hitool烧写fastboot提示超时,我的两个都是这么回事,怎么办?...
- 3D动画(CSS3)-animation
- Windows进程详解(完整版)
- 关于团队敏捷流程的思考
- pyecharts画地图—个性化设置
- 基于opencv的倾斜文本行的校正
- 比尔·盖茨买百万亩农地成美“头号地主”,图扑数字孪生农场
- Linux中pid与tid的异同及top中pid字段含义
- Python:百分制转五分制
- lc滤波电路电感电容值选择_几种常见的无源滤波电路
- 营销费用的预算管理原则和模式
- 人工神经网络算法实战教程
- Zhong__Centos8安装docker
- Java关键字之break简介说明
- 机器学习最易懂之贝叶斯模型详解与python实现