scala List源码
Scala的List主要属性为head和tail。
def head: A
def tail: List[A]
其中head为List的头部成员,而tail则为除了队首之外的元素的List对象。
Scala中的List可以通过类似::的操作来连接个元素组成一个List。
def ::[B >: A] (x: B): List[B] =new scala.collection.immutable.::(x, this)
其中新加入的队首元素必须其类型必须是当前List中所包含元素的类型的超类,该List所保存的元素类型也会被视为新的类型,之后构造新的case类 ::。
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {override def tail : List[B] = tloverride def isEmpty: Boolean = false
}
::约定该List的队首和tail为当前原有List,并保证为非空。
:::则可以完成List与List之前的连接。
def :::[B >: A](prefix: List[B]): List[B] =if (isEmpty) prefixelse if (prefix.isEmpty) thiselse (new ListBuffer[B] ++= prefix).prependToList(this)
如果当前List为空,则直接返回前置List,如果前置List为空,则直接返回当前List。
如果两者均不为空,则会通过ListBuffer的++=方法首先复制前置List。++=的主要逻辑主要在Growable中。
def ++=(xs: TraversableOnce[A]): this.type = {@tailrec def loop(xs: scala.collection.LinearSeq[A]) {if (xs.nonEmpty) {this += xs.headloop(xs.tail)}}xs match {case xs: scala.collection.LinearSeq[_] => loop(xs)case xs => xs foreach +=}this
}
如果参数为LinearSeq类(List继承自该类),将会在已经定义好的loop()方法中之心,否则需要自定义+=方法。
在loop()中将会依次将head取出保存,在得到tail在下一次递归继续去head元素。
在完成前置List的复制后,将会通过pretendToList()加上当前List并转为List。
def prependToList(xs: List[A]): List[A] = {if (isEmpty) xselse {if (exported) copy()last0.tl = xstoList}
map()方法将对List中的元素重新进行计算。
final override def map[B, That](f: A => B)(implicit bf: CanBuildFrom[List[A], B, That]): That = {if (bf eq List.ReusableCBF) {if (this eq Nil) Nil.asInstanceOf[That] else {val h = new ::[B](f(head), Nil)var t: ::[B] = hvar rest = tailwhile (rest ne Nil) {val nx = new ::(f(rest.head), Nil)t.tl = nxt = nxrest = rest.tail}h.asInstanceOf[That]}}else super.map(f)
}
在之定义新的转换函数,而采用默认的隐式函数的情况下,将会依次对List中的元素进行转换。
首先会对head元素进行转换,并生成新的case类::,之后会不断依次从tail往下遍历,不断根据下一个元素生成一个队首元素为下一个元素的新List作为tail并接下来以新的List的tail来接受下一个元素生成的新List。
其余遍历操作核心都类似map()操作。
scala List源码相关推荐
- IntelliJ IDEA scala的源码设置
intellij idea设置指向源代码--Scala的源码设置 下载源码包 首先在官网进行下载源码包https://www.scala-lang.org/download/ 解压压缩包 利用压缩工具 ...
- IDEA查看Scala的源码
1.下载源代码 点击这个链接:http://www.scala-lang.org/download/all.html 选择需要的版本点击打开: 在新打开的网页下方找到源代码下载项: 2.在intell ...
- Apache Spark源码走读之16 -- spark repl实现详解
欢迎转载,转载请注明出处,徽沪一郎. 概要 之所以对spark shell的内部实现产生兴趣全部缘于好奇代码的编译加载过程,scala是需要编译才能执行的语言,但提供的scala repl可以实现代码 ...
- 深入理解Spark 2.1 Core (一):RDD的原理与源码分析
摘要 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Datasets),它具备像MapReduce等数据流模型的容错特性,并且允许开发人员在大 ...
- Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)...
本博文的主要内容是: 1.rdd基本操作实战 2.transformation和action流程图 3.典型的transformation和action RDD有3种操作: 1. Trandform ...
- spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...
不多说,直接上干货! 前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...
- [scala-spark]2. Scala运行原理与源码查看
运行原理 韩顺平 查看源码 package com.lineshen.chapter1object lookSourceCode {def main(args: Array[String]): Uni ...
- 调用python接口并画图_【PySpark源码解析】教你用Python调用高效Scala接口
点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 机器之心专栏 作者:汇量科技-陈绪 众所周知,Spark 框架主要是由 Scala 语言实现,同时也包含少量 Java 代码.Spa ...
- 好爽 java_Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和ec...
Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和eclipse,现在换成intellij简直 ...
最新文章
- vsftpd被selinux阻止
- java enum(枚举)使用详解 + 总结
- vue router 原生html,Vue router 使用 History 模式导致页面请求 404
- 8位可控加减法器_行测高分技巧-资料分析之有效数字加减法取舍
- 格式 数组的基本使用 0912
- .NET下的开发者们正在继承计算机早期时代伟大的黑客精神
- Coca语料库的使用方法
- 【青少年编程】【三级】猫咪抓老鼠游戏
- 快速卸载软件和残余,很Nice的一款卸载工具—Your Unin-staller!
- 图解Pandas,数据结构介绍 | 图文第1篇
- 七八年了,第一次因悲伤而哭
- c语言计算个人成绩平均分,C语言 | 计算总平均分及第n个人的成绩
- 工作生活要懂得劳逸结合
- 上海理工大学计算机专业录取分数线,上海理工大学录取分数线2021是多少分(附历年录取分数线)...
- 超详细Redis入门教程
- uni-app的父与子页面传递参数之属性Props字段类型解析
- Java选择题(四)
- 计算机网络-自顶向下方法-笔记【第2章-应用层】
- mysql Excel导出文件损坏_phpexcel 导出excel无法打开,提示文件格式或文件名无效,文件损毁,解决办法...
- 为什么wps office在编辑文字鼠标点击一下整篇文字的背景就立刻变为灰色的
热门文章
- Spring Boot、Spring Cloud、Dubbo的区别
- 游侠怎么设置java路径_Java获取当前路径的代码
- nginx 调用dll_使用DLL中的资源
- listdir在python3_Python3 os.listdir() 方法
- datetime的文本时间处理
- maven 相关操作
- 《数学建模:基于R》——1.1 数据的描述性分析
- 电梯调度需求调研报告
- 如何妥善处理WebBrowser对Javascript的错误问题,阻止JS弹出框,提高用户体验(原创)...
- 售前工程师的成长---一个老员工的经验之谈(三)