Scala专题系列(四) : Scala集合

2022-04-18 13:55:23 浏览数 (1)

本节主要包括Scala中集合库的分类,集合的特质,集合的可变,不可变,并发以及并行性集合的使用

一:集合的特质

图:

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 // 得到最大下标元素值

0 人点赞