Scala集合

本文详细介绍了Scala集合框架,包括可变与不可变集合的概念,静态与延迟加载的区别,并展示了丰富的操作方法如map、filter、reduce等。此外,还提供了List的基本操作示例,如连接、填充、反转等。
摘要由CSDN通过智能技术生成

Scala集合

Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。

Scala 集合分为可变的和不可变的集合。

可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。

而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。

接下来我们将为大家介绍几种常用集合类型的应用:

序号 集合及描述
1 Scala List(列表)

List的特征是其元素以线性方式存储,集合中可以存放重复对象。

参考 API文档

2 Scala Set(集合)

Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。

参考 API文档

3 Scala Map(映射)

Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。

参考 API文档

4 Scala 元组

元组是不同类型的值的集合

5 Scala Option

Option[T] 表示有可能包含值的容器,也可能不包含值。

6 Scala Iterator(迭代器)

迭代器不是一个容器,更确切的说是逐一访问容器内元素的方法。

 

// 定义整型 List
val x = List(1,2,3,4)

// 定义 Set
val x = Set(1,3,5,7)

// 定义 Map
val x = Map("one" -> 1, "two" -> 2, "three" -> 3)

// 创建两个不同类型元素的元组
val x = (10, "Runoob")

// 定义 Option
val x:Option[Int] = Some(5)


Scala的集合类可以从三个维度进行切分:

可变与不可变集合(Immutable and mutable collections)

静态与延迟加载集合 (Eager and delayed evaluation )

串行与并行计算集合(Sequential and parallel evaluation )

 

可变与不可变集合

可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。

而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变

所有的集合类都可以在包scala.collectionscala.collection.mutablescala.collection.immutable,scala.collection.generic中找到。

下面的图表显示了scala.collection包中所有的集合类。这些都是高级抽象类或特性,它们通常具备和不可变实现一样的可变实现。

这里写图片描述

 

下面的图表显示scala.collection.immutable中的所有集合类。

这里写图片描述

 

下面的图表显示scala.collection.mutable中的所有集合类。

这里写图片描述

 

代码需要的大部分集合类都独立地存在于3种变体中,它们位于scala.collectionscala.collection.immutablescala.collection.mutable包。每一种变体在可变性方面都有不同的特征。

collection.generic包含了集合的构建块。集合类延迟了collection.generic类中的部分操作实现,另一方面集合框架的用户仅仅需要在异常环境中引用collection.generic的类。

1.scala.collection.immutable包是的集合类确保不被任何对象改变。例如一个集合创建之后将不会改变。因此,你可以确信的是在不同的位置和时间去访问同一个不可变集合的值,你将总是得到相同的元素。

2.scala.collection.mutable包的集合类则有一些操作可以修改集合。所以处理可变集合意味着你需要去理解哪些操作会导致集合改变。

3.scala.collection包中的集合,既可以是可变的,也可以是不可变的。scala.collection包中的根集合类中定义了和不可变集合相同的接口,同时,scala.collection.mutable包中的可变集合类代表性地往这个接口中添加了一些辅助作用的修改操作。

 

根集合类与不可变集合类之间的区别:不可变集合类可以确保没有人可以修改集合。然而,根集合类仅保证不修改集合本身。即使这个集合类没有提供修改集合的静态操作,它仍然可能在运行时作为可变集合被其它客户端所修改。

 

一个有用的约定,如果你想要同时使用可变和不可变集合类,只导入collection.mutable包即可。

import scala.collection.mutable

mutable.Set // 可变
Set         // 不可变

 

静态与延迟加载集合

transformation。集合中有大量的操作都是把一个集合“转换”成另一个集合,比如mapfilter等等。

而Eager和Delayed集合的区别在于:Eager集合总是立即为元素分配内存,当遇到一个transform动作时,Eager的集合会直接计算并返回结果,而Delayed集合则会尽可能晚的推迟执行,直到必须返回结果时才去执行。这一点和Spark RDD操作中的transformation和action非常类似。

在现有的集合里,只有Stream是Lasy的,所有其他的集合都是静态(Eager)加载的。但是你可以很容易地把一个静态集合转换成lazy的,那就是创建一个view。

 

操作方法

scala中的集合操作分为两类:转换操作(transformation )和行动操作(actions)(有些人喜欢叫他为聚合操作)。第一种操作类型将集合转换为另一个集合,第二种操作类型返回某些类型的值。

 

常用操作符

scala中的操作符也是类中的方法:

++ 从列表的尾部添加另外一个列表

++: 在列表的头部添加一个列表

+: 在列表的头部添加一个元素

:+ 在列表的尾部添加一个元素

:: 在列表的头部添加一个元素

::: 在列表的头部添加另外一个列表

val left = List(1,2,3)
val right = List(4,5,6)

//以下操作等价
left ++ right   // List(1,2,3,4,5,6)
left ++: right

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值