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源码相关推荐

  1. IntelliJ IDEA scala的源码设置

    intellij idea设置指向源代码--Scala的源码设置 下载源码包 首先在官网进行下载源码包https://www.scala-lang.org/download/ 解压压缩包 利用压缩工具 ...

  2. IDEA查看Scala的源码

    1.下载源代码 点击这个链接:http://www.scala-lang.org/download/all.html 选择需要的版本点击打开: 在新打开的网页下方找到源代码下载项: 2.在intell ...

  3. Apache Spark源码走读之16 -- spark repl实现详解

    欢迎转载,转载请注明出处,徽沪一郎. 概要 之所以对spark shell的内部实现产生兴趣全部缘于好奇代码的编译加载过程,scala是需要编译才能执行的语言,但提供的scala repl可以实现代码 ...

  4. 深入理解Spark 2.1 Core (一):RDD的原理与源码分析

    摘要 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Datasets),它具备像MapReduce等数据流模型的容错特性,并且允许开发人员在大 ...

  5. Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)...

    本博文的主要内容是: 1.rdd基本操作实战 2.transformation和action流程图 3.典型的transformation和action RDD有3种操作: 1.  Trandform ...

  6. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  7. [scala-spark]2. Scala运行原理与源码查看

    运行原理 韩顺平 查看源码 package com.lineshen.chapter1object lookSourceCode {def main(args: Array[String]): Uni ...

  8. 调用python接口并画图_【PySpark源码解析】教你用Python调用高效Scala接口

    点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 机器之心专栏 作者:汇量科技-陈绪 众所周知,Spark 框架主要是由 Scala 语言实现,同时也包含少量 Java 代码.Spa ...

  9. 好爽 java_Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和ec...

    Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和eclipse,现在换成intellij简直 ...

最新文章

  1. vsftpd被selinux阻止
  2. java enum(枚举)使用详解 + 总结
  3. vue router 原生html,Vue router 使用 History 模式导致页面请求 404
  4. 8位可控加减法器_行测高分技巧-资料分析之有效数字加减法取舍
  5. 格式 数组的基本使用 0912
  6. .NET下的开发者们正在继承计算机早期时代伟大的黑客精神
  7. Coca语料库的使用方法
  8. 【青少年编程】【三级】猫咪抓老鼠游戏
  9. 快速卸载软件和残余,很Nice的一款卸载工具—Your Unin-staller!
  10. 图解Pandas,数据结构介绍 | 图文第1篇
  11. 七八年了,第一次因悲伤而哭
  12. c语言计算个人成绩平均分,C语言 | 计算总平均分及第n个人的成绩
  13. 工作生活要懂得劳逸结合
  14. 上海理工大学计算机专业录取分数线,上海理工大学录取分数线2021是多少分(附历年录取分数线)...
  15. 超详细Redis入门教程
  16. uni-app的父与子页面传递参数之属性Props字段类型解析
  17. Java选择题(四)
  18. 计算机网络-自顶向下方法-笔记【第2章-应用层】
  19. mysql Excel导出文件损坏_phpexcel 导出excel无法打开,提示文件格式或文件名无效,文件损毁,解决办法...
  20. 为什么wps office在编辑文字鼠标点击一下整篇文字的背景就立刻变为灰色的

热门文章

  1. Spring Boot、Spring Cloud、Dubbo的区别
  2. 游侠怎么设置java路径_Java获取当前路径的代码
  3. nginx 调用dll_使用DLL中的资源
  4. listdir在python3_Python3 os.listdir() 方法
  5. datetime的文本时间处理
  6. maven 相关操作
  7. 《数学建模:基于R》——1.1 数据的描述性分析
  8. 电梯调度需求调研报告
  9. 如何妥善处理WebBrowser对Javascript的错误问题,阻止JS弹出框,提高用户体验(原创)...
  10. 售前工程师的成长---一个老员工的经验之谈(三)