一:集合的特质
图:
Scala集合继承层次中的关键特质
层级1 :Iterable指的是哪些能生成涌来访问集合中所有元素的Iterator的集合
代码语言:javascript复制val collection = …
val iter = collection.iterator
while(item.hasNext){ … }
上面一段代码是对集合的遍历的一种基本操作,不过,还有更加方便,便捷的操作方式
层级2 :Seq时一个有先后次序的值的序列,比如数组或者列表。IndexedSed允许我们通过整型的下标快速地访问任意元素,比如:Array和ArrayBuffer是有下标的,但链表没有。
Set是一组没有先后次序的值,在SortedSet中,元素以某种排过序的顺序被访问
Map是一组(键,值)对偶,SortedMap按照键的顺序访问其中的value
apply方法
每个Scala集合或类都有一个带有apply方法的伴生对象,这个apply方法可以用来构建该集合中的实例
比如:
代码语言:javascript复制Map(“name” -> “张三”)
Set(“1”,“2”)
apply方法介绍
一段代码解释:
class F(s :String){
}
Object F{
def apply(s :String):F = {
new F(s)
}
}
定义了一个F类,并且在这个类中,有一个伴生对象F,里面定义了apply方法。有了这个apply方法以后,我们在调用这个F类的时候,用函数的方式来调用:
object C { def main(args: Array[String]): Unit = { val f = F("Hello") } }
我们用F("Hello")的方式,就得到了一个F类型的对象,这就是apply方法的作用。加入没有apply方法,需要使用new关键字来得到F对象
二:集合的可变与不可变性
Scala中同时支持可变和不可变的集合,不可变的集合从不改变,因此是线程安全的
Scala编程中优先采用不可变集合,在Scala.collection 包中的伴生对象产出不可变的集合,比如:scala.collection.Map("year" -> 2017)就是一个不可变的映射
在不可变集中,如果要添加元素,那么它将会生成一个新的集合,比如:
val map = Map("year" -> 2017)
val res1 = map ("month" -> 10)
println(res1) // print Map(year -< 2017,month -> 10)
那么它将会重新生成一个含有两个元素的集合,如果添加的元素在集合中已经存在,那么返回的将是老的集合的引用
列表(List)
在Scala中,列表(List) 要么是Nil(空表)要么是一个head元素加上一个tail,而tail又是一个列表,比如
val list = List(1,2)
list.head的值是1,而list.tailde是list(2),在进一步,list.tail.head是2,list.tail.tail是Nil
:: 操作符从给定的头和尾创建一个新的列表,比如:
9 :: List(1,2)
那么就会生成一个List(9,1,2)的新集合
注意: :: 右结合的,通过 :: 操作符,列表将会从末端开始构建
集(Set)
集(Set)是不重复元素的集合,如果我们将已有元素加入是没有效果的
和列表List不同,集不保留元素插入的顺序,所以Set是无序的,Set是以哈希集实现的其元素根据hashCode方法的值进行组织
Seq序列
Seq是元素有插入的先后顺序,可以有重复元素
Seq是列表,适合存有序重复数据,进行快速插入/删除元素等场景
Set是集合,适合存无序非重复数据,进行快速查找海量元素等场景
本质上的区别就是数据结构的使用.
如果想使用可以排序的集,可以使用SortedSet , SortedSet是基于红黑树实现的
集合中添加元素用 ,移除元素使用 - , 如果要添加多个元素可以使用
Scala提供了很多用于添加和移除元素的操作符,
向后(: ) 或 向前( :) 追加元素到序列当中
添加( )元素到无先后次序的集合中
用 - 移除元素
用 和--来批量添加和移除元素
对于列表,优先使用::和:::
改值操作有 =, =,-= 和--=
对于集合,更偏向于使用 , & 和 --
尽量不适用 :, =:和 =:
Iterable特质最重要的方法如下:
拉链操作
有时我们需要将两个集合的元素结合在一起,比如 :
val list1 = List(1.0,2.3,3.4)
val list2 = List(1,2,3,4)
那么zip方法让你将它们组合成一个个对偶的列表,例如
list1 zip list2 // 将得到一个List[(Double,Int)]
zip就是一个拉链操作
如果一个集合的元素个数比另一个集合的元素个数要小,那么结果中的对偶数量以较短的那个List相同
比如:
val list1 = List(1.0,2.0,3.4)
val list2 = List(1,2)
list1 zip list2 // 得到 List((1.0,1),(2.0,2))
zipAll 方法可以来指定较短列表的缺省值
List(1.0,2,0,3.0) zipAll(List(1,2),0.0,3) // 得到List((1.0,1),(2.0,2),(3.0,3))
zipWithIndex 方法返回对偶的列表,其中每个对偶中第二个组成部分是每个元素的下标
比如:
"Hello".zipWithIndex // 得到 Vetor(("H",0),("e",1),("l",2),("l",3),("0",4))
"Hello".zipWithIndex.max // 得到最大下标元素值