当前位置:网站首页>Scala 高阶(七):集合内容汇总(上篇)
Scala 高阶(七):集合内容汇总(上篇)
2022-08-09 11:57:00 【51CTO】
文章目录
Scala中的集合与Java中的集合相类似,但是又有很多的改变,接下来我们开启Scala集合篇的学习历程吧!
一、概述
在
Java
中的集合分为三大类:List
集合、Set
集合、Map
集合。其中List集合、Set集合继承自Collection
。它们都是接口。Scala
的集合有三大类:序列Seq
、集Set
、映射Map
,所有的集合都扩展自Iterable
特质。对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两个包:不可变集合:
scala.collection.immutable
、可变集合: scala.collection.mutable
不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而
不会对原对象进行修改。类似于 java 中的 String 对象。可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似
于 java 中 StringBuilder 对象Scala中的集合都是引用类型,并不关心指向的对象中的内容,只关心当前指向的对象。
建议:在操作集合的时候,不可变用符号,可变用方法。
不可变集合
<center>整体继承图(来源于网络)
- Scala中的Set 和 Map集合包含的类与Java相类似,不同的是Seq下面分为
IndexedSeq
和LinearSeq
两个特质。 - scala中的
String
就是java.lang.String
,和集合无直接关系,所以是虚箭头,是通过Perdef
中的低优先级隐式转换来做到的。经过隐式转换为一个包装类型后就可以当做集合了。 IndexedSeq
是通过索引来查找和定位,因此速度快,比如 String 就是一个索引集合,通过索引即可定位LinearSeq
是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找.
可变集合
<center>整体继承图(来源于网络)
不可变和可变:
- 不可变指的是对象大小不可变,但是可以修改元素的值,需要注意这一点。而如果用了val不变量存储,那么指向对象的地址也不可变。
- 不可变集合在原集合上不能进行插入删除数据,只能返回新的集合。
二、数组(Array)
不可变数组
如何定义?
- 集合类型大多都支持泛型,语法是
[Type]
,不同于java的<Type>
。 [Int]
是指定可以存放的数据类型,如果希望存放任意数据类型,则指定Any
(10)
,表示数组的大小,确定后就不可以变化
代码如下:
- 第二种创建方式使用
apply
方法创建数组对象 - 添加元素时
:
在前,对象在前,:
在后,对象在后。 - 访问元素使用()运算符,通过a
pply/update
方法实现,源码中的实现只是抛出错误作为存根方法(stab method),具体逻辑由编译器填充。
可变数组
如何定义?
[Int]
表示存放整型的数据()
初始化的数据,整型默认为0ArrayBuffer
需要引入scala.collection.mutable.ArrayBuffer
代码实操:
可变与不可变集合转换
- 不可变数组转可变数组
arr1.toBuffer
返回结果才是一个可变数组,arr1
本身没有变化 - 可变数组转不可变数组
arr2.toArray
返回结果才是一个不可变数组,arr2
本身没有变化
举个栗子:
多维数组
定义:
举个栗子:
三、列表(List)
不可变List
如何定义?
List
默认为不可变集合,数据有序且可重复sealed
修饰的一个抽象的密封类。提供了一个约束,打包密封在当前文件内,当前类的子类不能定义在文件之外。- 本身是一个抽象类,不能使用
new
对象的方式,使用半生对象的apply
方法进行创建 - 遍历集合
- 访问元素
- 添加元素
+: :+
首尾添加元素,Nil
空列表,::
添加元素到表头
Nil.::(元素)
创建新的列表,29 :: 99 :: 80 :: 43 :: Nil
相当于给列表头部一直添加元素,定义一个新列表。- 合并连个列表:
list1 :: list2
将list1
整个列表合并到list2
。list1 ::: list2
或者list1 ++ list2
将list1
的各个元素合并到list2
。++
底层也是调用:::
可变ListBuffer
如何定义?
- 可以使用
new
对象的方式,也可使用伴生对象的apply
方法创建 - 添加元素
append prepend insert
添加元素到头或尾:+=: +=
- 合并集合:
list1 ++ list2
或者list1 ++= list2
前者得到新的列表,后者将元素合并到list1
- 修改元素:
list(index) = value
底层调用update
方法 - 删除元素:
remove
或者-=
四、Set集合
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用scala.collection.mutable.Set
包
不可变Set
如何创建?
- 默认为不可变的Set,数据不可重复且无序。
- 初始化集合时数据会被去重,可以用做去重操作。
- 添加元素:
set + 元素
- 合并集合:
set1 ++ set2
得到新的Set集合 - 删除元素:
set - 元素
代码实操:
可变Set
如何创建?
- 添加元素:
set += 元素
调用add()
- 删除元素:
set -= 元素
调用remove()
- 合并两个集合:
set1 ++= set2
代码实操:
五、Map集合
不可变Map
如何创建?
- 默认为不可变的Map。
- 元素
key -> value
键值对儿,为二元组类型。
代码实操:
可变Map
类似于不可变的Map,直接上代码实操。
六、元组
元组也是可以理解为一个容器,可以存储相同或者不同类型的数据,换句话说就是将多个无关的数据封装为一个整体。
- 声明元组的方式:
(元素 1,元素 2,元素 3,......)
- 元组中最大能有22个元素,
Tuple1
定义到了Tuple22
。 - 访问元组:
_顺序号
- 通过索引访问元素
tuple.productElement(index)
- 遍历元组:
for (elem <- tuple.productIterator)
举个栗子:
本次Scala集合内容汇总的上篇到这里就结束了,内容篇幅较长,干货满满,希望对大家学习Scala语言有所帮助!!!
边栏推荐
猜你喜欢
Win10调整磁盘存储空间详解
【Data augmentation in NLP】——1
用皮肤“听”音乐,网友戴上这款装备听音乐会:仿佛住在钢琴里
超越CLIP的多模态模型,只需不到1%的训练数据!南加大最新研究来了
基于STM32+铂电阻设计的测温仪
《数字经济全景白皮书》银行业智能营销应用专题分析 发布
放下手机吧:实验表明花20分钟思考和上网冲浪同样快乐
Semaphore SIGCHLD use, how to make the parent that the child performs over, how to make the distinction between multiple child processes. The end
在北极都可以穿短袖了,温度飙升至32.5℃
京东架构师呕心整理:jvm与性能调优有哪些核心技术知识点
随机推荐
鹅厂机器狗花式穿越10m梅花桩:前空翻、单桩跳、起身作揖...全程不打一个趔趄...
非科班AI小哥火了:他没有ML学位,却拿到DeepMind的offer
WPF implements a MessageBox message prompt box with a mask
国产抗新冠口服药每瓶不超300元/ 我国IPv6网络全面建成/ 谷歌入局折叠屏手机...今日更多新鲜事在此...
Here comes the question: Can I successfully apply for 8G memory on a machine with 4GB physical memory?
GET请求和POST请求区别
阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
实验记录:搭建网络过程
Visual Studio 2017 ASP.NET Framework MVC 项目 MySQL 配置连接
900页数学论文证明旋转的黑洞不会爆炸,丘成桐:30多年来广义相对论首次重大突破...
JS封装防抖(代码持续优化)
proto3-2语法
The latest interview summary in 20022 brought by Ali senior engineer is too fragrant
Summary of learning stages (knapsack problem)
WeChat Mini Program Payment and Refund Overall Process
太卷了... 腾讯一面被问到内存满了,会发生什么?
元宇宙:下一代互联网启程(附元宇宙深度报告PDF)
曲鸟全栈UI自动化教学(八):框架代码讲解和进一步优化
一甲子,正青春,CCF创建六十周年庆典在苏州举行
报告:想学AI的学生数量已涨200%,老师都不够用了