对于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实现的初步分析相关推荐

  1. 蛋白质芯片查找与GEO2R进行初步分析

    1.蛋白质芯片查找 GEO网站:https://www.ncbi.nlm.nih.gov/gds 检索词:Pancreatic cancer;Protein profiling by protein ...

  2. Azure底层架构的初步分析

    之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...

  3. linux内核的I2C子系统详解3——i2c-core.c初步分析、I2C总线的匹配机制

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 5.i2c-core.c初步分析 (1)smbus代码略过:smbus是基于I2C总线发展出来的. (2)模块加载和卸 ...

  4. 驱动框架2——内核驱动框架中LED的基本情况、初步分析

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.内核驱动框架中LED的基本情况 1.相关文件 (1)drivers/leds目录 驱动框架规定的LED这种硬件的驱动应该待的地方. (2 ...

  5. 【2017年第3期】大数据服务三农的初步分析与探索

    孙忠富, 褚金翔, 马浚诚, 杜克明, 郑飞翔 中国农业科学院农业环境与可持续发展研究所,北京 100081 摘要:三农问题是当前中国密切关注的社会问题,大数据技术的发展为三农带来了新的机遇.首先,对 ...

  6. tomcat4 请求的处理——初步分析

    tomcat4 请求的处理--初步分析 以tomcat4为例, 每当HttpConnector的ServerSocket得到客户端的连接时,会创建一个Socket. 接下来就处理这个Socket发来的 ...

  7. DirectUI的初步分析-转

    DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是 ...

  8. 2017 Python 问卷调查结果初步分析

    Note:本文在我的个人站点同步发布:2017 Python 问卷调查结果初步分析 · Lee's Space Station,无广告,体验更好. 未经授权,禁止转载. 前言 2017 年末,PSF( ...

  9. 基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗

    基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗 1. 2022高考数学全国卷I概率题 2. 卡方(χ2\chi^2χ2)检验原理回顾 3. 解答2022高考数学全国卷I概率题 4. 上 ...

最新文章

  1. Koa 本地搭建 HTTPS 环境
  2. Httpservlet cannot be resolved to a type的原因与解决方法
  3. 【python教程】IO文件操作的常见用法
  4. Active Directory备份与还原
  5. BZOJ3707 圈地
  6. 魔百盒服务器响应超时,hitool烧写fastboot提示超时,我的两个都是这么回事,怎么办?...
  7. 3D动画(CSS3)-animation
  8. Windows进程详解(完整版)
  9. 关于团队敏捷流程的思考
  10. pyecharts画地图—个性化设置
  11. 基于opencv的倾斜文本行的校正
  12. 比尔·盖茨买百万亩农地成美“头号地主”,图扑数字孪生农场
  13. Linux中pid与tid的异同及top中pid字段含义
  14. Python:百分制转五分制
  15. lc滤波电路电感电容值选择_几种常见的无源滤波电路
  16. 营销费用的预算管理原则和模式
  17. 人工神经网络算法实战教程
  18. Zhong__Centos8安装docker
  19. Java关键字之break简介说明
  20. 机器学习最易懂之贝叶斯模型详解与python实现

热门文章

  1. kinect2用法实例学习笔记以及常识信息
  2. 计蒜客题目 Home Work
  3. qt实现锁屏功能,即点击锁屏按钮后再点击界面则无效
  4. 【※iPad到底有些什么用※lpxt】
  5. 第五章 有关IP协议的技术
  6. 由高通8295车规级芯片算力TOPS想起车载常用嵌入式系统的TOPS
  7. 静态图片转3D动态GIF/视频
  8. tui-image-editor 图片编辑功能
  9. 去Java培训班真的有用吗?
  10. SEO实战(一)网站白帽SEO步骤总结--新站百度指数70词优化至首页第1