在开始今天的内容前,先回复下在上一篇笔记的热心读者的问题:
1 既然是读书笔记,是读的哪本书?
这本书的名字叫《快学scala》,虽然是本比较久远的书,但是也算是scala入门非常经典的读物,主要是对比java和scala的语言特点写出来的,我早期做了这样一套读书笔记,由于工作的需要,要重新使用scala,而且Scala的版本也有了较大变化,这里就当做温故知新,贴出来也算是抛砖引玉,希望Spark高手能给大家带来精彩的Spark源代码解析。
2 为什么笔记的内容和原书的解释不一样?
读书笔记,在读的过程中肯定会有自己的理解,另外scala的版本也有较大改动,自然就会有出入。而且一些新的特性肯定要以新的版本为准。而且这是第二遍读这本书,也是根据原来的笔记内容做整理,难免会和书上的描述不一样。
3 这个笔记会连载多少期?
看大家对scala和spark的程度,但是至少会连载到这个读书笔记完成,第一篇内容篇幅较短,主要想了解大家对scala的热情。如果大家需要,后面会继续连载spark的源代码分析。
下面我们开始正式的内容:
3 数组
3.1 定长数组
scala的数组分成定长和变长数组,先看如何生成新的定长10个Int数组
scala> val nums = new Array[Int](10)
生成10个元素的字符串数组
scala> val strs = new Array[String(10)
//初始化为null
3.2 变长数组
变长数组和Java的ArrayList是等效的,定义的方法如下:
scala> import scala.collection.mutable.ArrayBuffer
scala> val ab = ArrayBuffer[Int]()
scala> ab += ( 1, 2, 3 )
//在末尾添加多个元素
//ArrayBuffer(1, 2, 3)
也可以对数组做插入和移除操作,但是并不高效,因为后面的元素会进行平移,使用的命令如下
scala> ab.insert(2, 6)
//在下标2之前插入,下标以0开始
scala> ab.remove(2, 4)
//在下标2开始,移除4个元素
定长数组和变长数组(数组缓冲)之间是可以转换的
scala> ab.toArray
scala> ab.toBuffer
3.3 遍历数组
scala> for ( i <- 0 util a.length)
| println( i + ": “ + a(i))
这里注意 0 util 10 实际上是一个方法的调用: 0.util(10),如果不需要使用数组下标也可以用这样的方法:
scala> for ( klem <- a )
| println(elem)
来一些更高级的用法,过滤部分元素
scala> for ( klem <- a if elem % 2 == 0 ) yield 2 * elem
3.4 对数组的常用运算
求和与排序—最常用的两个运算
scala> Array(1, 6, 4, 3).sum
排序需要说哪一个sorted()方法
val ab = ArrayBuffer(1, 7, 2, 9)
val abSorted = ab.sorted(_ < _ )
//ab是常量不变,abSorted是ArrayBuffer(1, 2, 7, 9)
scala还能支持多维数组,还有很多的数组操作方法,详见官方文档
http://www.scala-lang.org/api/2.11.8/#scala.Array
4 映射
4.1 映射(Map)是非常灵活的数据结构,简单说就是key/value对的一组集合。映射也可以构建出可变和不可变映射两类。构建一个不可变的映射:
scala> val scores = Map(“Alice” -> 10, “Bob” -> 20, “Cindy” -> 30)
构建一个可变映射方法如下:
scala> val scores = scala.collenction.mutable.Map(“Alice” -> 10, “Bob” -> 20, “Cindy” -> 30)
也可以先构建一个空格的映射开始,但是必须指定类型参数
scala> val scores = scala.collenction.mutable.HashMap[String, Int]
4.2 映射赋值
映射赋值和增加新的映射关系操作相同
scala> scores(“Bob”) = 10
或者使用 += 操作,同样的也可以使用-=移除某个键值对。
scala> scores -= “Alice"
这里要注意的是不能更新一个不可变的映射,但是可以将操作结果传给新的映射。
还可以反转映射,即key/value互换
scala> for( (k, v) <- 映射) yield(v, k)