前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala专题系列(四) : Scala集合

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

作者头像
用户5252199
发布2022-04-18 13:55:23
6350
发布2022-04-18 13:55:23
举报
文章被收录于专栏:大数据技术博文
本节主要包括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 // 得到最大下标元素值

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术博文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档