Scala函数式程序设计原理 week6 collections
集合特质
Seq是一个有先后次序的值的序列,比如数组或列表。IndexSeq允许我们通过整型的下标快速访问任意元素。
Set是一组没有先后次序的值。在SortedSet中,元素以某种排过序的顺序被访问。
Map是一组(键,值)对偶。SortedMap按照键的排序访问其中的实体。
集合类型定义的增删操作符
Iterable特质的重要方法
可变和不可变集合
Scala同时支持可变和不可变的集合。不可变的集合从不改变,因此你可以安全地共享其引用,甚至在一个多线程的应用程序中也没问题。
Scala优先采用不可变集合
序列
Vector
Vector是ArrayBuffer的不可变版本,一个带下标的序列,支持快速的随机访问。向量以树形结构的形式实现,每个节点可以有不超过32个子结点,对于一个有100万个元素的向量而言,只需4层结点。
Range
Range表示一个整数序列,Range对象并不存储所有值而是只有起始值,结束值和增值。
可以用to
(包含末尾)和until
(不含末尾)和by
(步长)方法构造Range对象。
val r:Range = 1 until 5//1,2,34
val s:Range = 1 to 5//1,2,3,4,5
1 to 10 by 3 //1,4,7,10
Array和String
Array和String支持和Seq相同的操作,可以隐式地转换成序列。(他们不能成为序列的子类,因为他们来组与Java)
val xs:Array[Int] = Array(1,2,3)
xs map (x => 2*x)
val ys: String = "Hello"
ys filter (_.isUpper)
可变列表
可变的LinkedList
和不可变的List
相似,可以通过对elem引用赋值来修改其头部,对next引用赋值来修改其尾部。
for循环表达式
集Set
集是不重复元素的集合。集是无序的。
映射Map
另一个基础集合类型是map.一个类型为Map[Key,Value]
的数据结构。
查询映射
map.getOrElse(key,default_value)
更新映射
在可变映射中,可以更新映射的值,或者添加一个新的映射关系
scores(“Bob”) = 10
迭代映射
for ((k,v) <- 映射) 处理k和v
默认值
至今为止,映射是偏函数,一个并非对所有输入值都有定义的函数。withDefaultValue
操作可以将一个映射转换成完全函数。
val cap1 = capitalOfCounry withDefaultValue "<unknown>"
cap1("abc")//"unkonwn"