一、集合简介

Scala中拥有多种集合类型,主要分为可变的和不可变的集合两大类:

  • 可变集合: 可以被修改。即可以更改,添加,删除集合中的元素;
  • 不可变集合类:不能被修改。对集合执行更改,添加或删除操作都会返回一个新的集合,而不是修改原来的集合。

二、集合结构

Scala中的大部分集合类都存在三类变体,分别位于scala.collection, scala.collection.immutable, scala.collection.mutable包中。还有部分集合类位于scala.collection.generic包下。

  • scala.collection.immutable :包是中的集合是不可变的;
  • scala.collection.mutable :包中的集合是可变的;
  • scala.collection :包中的集合,既可以是可变的,也可以是不可变的。
val sortSet = scala.collection.SortedSet(1, 2, 3, 4, 5)
val mutableSet = collection.mutable.SortedSet(1, 2, 3, 4, 5)
val immutableSet = collection.immutable.SortedSet(1, 2, 3, 4, 5)

如果你仅写了Set 而没有加任何前缀也没有进行任何import,则Scala默认采用不可变集合类。

scala> Set(1,2,3,4,5)
res0: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

3.1 scala.collection

scala.collection包中所有集合如下图:

3.2 scala.collection.mutable

scala.collection.mutable包中所有集合如下图:

3.2 scala.collection.immutable

scala.collection.immutable包中所有集合如下图:

三、Trait Traversable

Scala中所有集合的顶层实现是Traversable 。它唯一的抽象方法是foreach

def foreach[U](f: Elem => U)

实现Traversable的集合类只需要实现这个抽象方法,其他方法可以从Traversable继承。Traversable中的所有可用方法如下:

方法 作用
Abstract Method:  
xs foreach f 为 xs 的每个元素执行函数 f
Addition:  
xs ++ ys 一个包含 xs 和 ys 中所有元素的新的集合。 ys 是一个 Traversable 或 Iterator。
Maps:  
xs map f 对 xs 中每一个元素应用函数 f,并返回一个新的集合
xs flatMap f 对 xs 中每一个元素应用函数 f,最后将结果合并成一个新的集合
xs collect f 对 xs 中每一个元素调用偏函数 f,并返回一个新的集合
Conversions:  
xs.toArray 将集合转化为一个 Array
xs.toList 将集合转化为一个 List
xs.toIterable 将集合转化为一个 Iterable
xs.toSeq 将集合转化为一个 Seq
xs.toIndexedSeq 将集合转化为一个 IndexedSeq
xs.toStream 将集合转化为一个延迟计算的流
xs.toSet 将集合转化为一个 Set
xs.toMap 将一个(key, value)对的集合转化为一个Map。 如果当前集合的元素类型不是(key, value)对形式, 则报静态类型错误。
Copying:  
xs copyToBuffer buf 拷贝集合中所有元素到缓存 buf
xs copyToArray(arr,s,n) 从索引 s 开始,将集合中最多 n 个元素复制到数组 arr。 最后两个参数是可选的。
Size info:  
xs.isEmpty 判断集合是否为空
xs.nonEmpty 判断集合是否包含元素
xs.size 返回集合中元素的个数
xs.hasDefiniteSize 如果 xs 具有有限大小,则为真。
Element Retrieval:  
xs.head 返回集合中的第一个元素(如果无序,则随机返回)
xs.headOption 以 Option 的方式返回集合中的第一个元素, 如果集合为空则返回 None
xs.last 返回集合中的最后一个元素(如果无序,则随机返回)
xs.lastOption 以 Option 的方式返回集合中的最后一个元素, 如果集合为空则返回 None
xs find p 以 Option 的方式返回满足条件 p 的第一个元素, 如果都不满足则返回 None
Subcollection:  
xs.tail 除了第一个元素之外的其他元素组成的集合
xs.init 除了最后一个元素之外的其他元素组成的集合
xs slice (from, to) 返回给定索引范围之内的元素组成的集合 (包含 from 位置的元素但不包含 to 位置的元素)
xs take n 返回 xs 的前n个元素组成的集合(如果无序,则返回任意n个元素)
xs drop n 返回 xs 的后n个元素组成的集合(如果无序,则返回任意n个元素)
xs takeWhile p 从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有遍历到的值。
xs dropWhile p 从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有未遍历到的值。
xs filter p 返回满足条件 p 的所有元素的集合
xs withFilter p 集合的非严格的过滤器。后续对 xs 调用方法 map、flatMap 以及 withFilter 都只用作于满足条件 p 的元素,而忽略其他元素
xs filterNot p 返回不满足条件 p 的所有元素组成的集合
Subdivisions:  
xs splitAt n 在给定位置拆分集合,返回一个集合对 (xs take n, xs drop n)
xs span p 根据给定条件拆分集合,返回一个集合对(xs takeWhile p, xs dropWhile p)。即遍历元素,直到遇到第一个不符合条件的值则结束遍历,将遍历到的值和未遍历到的值分别放入两个集合返回。
xs partition p 按照筛选条件对元素进行分组
xs groupBy f 根据鉴别器函数 f 将 xs 划分为集合映射
Element Conditions:  
xs forall p 判断集合中所有的元素是否都满足条件 p
xs exists p 判断集合中是否存在一个元素满足条件 p
xs count p xs 中满足条件 p 的元素的个数
Folds:  
(z /: xs) (op) 以 z 为初始值,从左到右对 xs 中的元素执行操作为 op 的归约操作
(xs :\ z) (op) 以 z 为初始值,从右到左对 xs 中的元素执行操作为 op 的归约操作
xs.foldLeft(z) (op) 同 (z /: xs) (op)
xs.foldRight(z) (op) 同 (xs :\ z) (op)
xs reduceLeft op 从左到右对 xs 中的元素执行操作为 op 的归约操作
xs reduceRight op 从右到左对 xs 中的元素执行操作为 op 的归约操作
Specific Folds:  
xs.sum 累计求和
xs.product 累计求积
xs.min xs 中的最小值
xs.max xs 中的最大值
String:  
xs addString (b, start, sep, end) 向 StringBuilder b 中添加一个字符串, 该字符串包含 xs 的所有元素。start、seq 和 end 都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。
xs mkString (start, seq, end) 将集合转化为一个字符串。start、seq 和 end 都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。
xs.stringPrefix 返回 xs.toString 字符串开头的集合名称
Views:  
xs.view 生成 xs 的视图
xs view (from, to) 生成 xs上指定索引范围内元素的视图

下面为部分方法的使用示例:

scala> List(1, 2, 3, 4, 5, 6).collect { case i if i % 2 == 0 => i * 10 }
res0: List[Int] = List(20, 40, 60)

scala> List(1, 2, 3, 4, 5, 6).withFilter(_ % 2 == 0).map(_ * 10)
res1: List[Int] = List(20, 40, 60)

scala> (10 /: List(1, 2, 3)) (_ + _)
res2: Int = 16

scala> List(1, 2, 3, -4, 5) takeWhile (_ > 0)
res3: List[Int] = List(1, 2, 3)

scala> List(1, 2, 3, -4, 5) span (_ > 0)
res4: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5))

scala> List(1, 2, 3).mkString("[","-","]")
res5: String = [1-2-3]

四、Trait Iterable

Scala中所有的集合都直接或者间接实现了Iterable特质,Iterable拓展自Traversable,并额外定义了部分方法:

方法 作用
Abstract Method:  
xs.iterator 返回一个迭代器,用于遍历 xs 中的元素, 与foreach遍历元素的顺序相同。
Other Iterators:  
xs grouped size 返回一个固定大小的迭代器
xs sliding size 返回一个固定大小的滑动窗口的迭代器
Subcollections:  
xs takeRigtht n 返回 xs 中最后 n 个元素组成的集合(如果无序,则返回任意 n 个元素组成的集合)
xs dropRight n 返回 xs 中除了最后 n 个元素外的部分
Zippers:  
xs zip ys 返回 xs 和 ys 的对应位置上的元素对组成的集合
xs zipAll (ys, x, y) 返回 xs 和 ys 的对应位置上的元素对组成的集合。其中较短的序列通过附加元素 x 或 y 来扩展以匹配较长的序列。
xs.zipWithIndex 返回一个由 xs 中元素及其索引所组成的元素对的集合
Comparison:  
xs sameElements ys 测试 xs 和 ys 是否包含相同顺序的相同元素

所有方法的使用示例如下:

scala> List(1, 2, 3).iterator.reduce(_ * _ * 10)
res0: Int = 600

scala> List("a","b","c","d","e") grouped 2 foreach println
List(a, b)
List(c, d)
List(e)

scala> List("a","b","c","d","e") sliding 2 foreach println
List(a, b)
List(b, c)
List(c, d)
List(d, e)

scala>  List("a","b","c","d","e").takeRight(3)
res1: List[String] = List(c, d, e)

scala> List("a","b","c","d","e").dropRight(3)
res2: List[String] = List(a, b)

scala> List("a","b","c").zip(List(1,2,3))
res3: List[(String, Int)] = List((a,1), (b,2), (c,3))

scala> List("a","b","c","d").zipAll(List(1,2,3),"",4)
res4: List[(String, Int)] = List((a,1), (b,2), (c,3), (d,4))

scala> List("a","b","c").zipAll(List(1,2,3,4),"d","")
res5: List[(String, Any)] = List((a,1), (b,2), (c,3), (d,4))

scala> List("a", "b", "c").zipWithIndex
res6: List[(String, Int)] = List((a,0), (b,1), (c,2))

scala> List("a", "b") sameElements List("a", "b")
res7: Boolean = true

scala> List("a", "b") sameElements List("b", "a")
res8: Boolean = false

五、修改集合

当你想对集合添加或者删除元素,需要根据不同的集合类型选择不同的操作符号:

操作符 描述 集合类型
coll(k)
即coll.apply(k)
获取指定位置的元素 Seq, Map
coll :+ elem
elem +: coll
向集合末尾或者集合头增加元素 Seq
coll + elem
coll + (e1, e2, …)
追加元素 Seq, Map
coll - elem
coll - (e1, e2, …)
删除元素 Set, Map, ArrayBuffer
coll ++ coll2
coll2 ++: coll
合并集合 Iterable
coll – coll2 移除coll中包含的coll2中的元素 Set, Map, ArrayBuffer
elem :: lst
lst2 :: lst
把指定列表(lst2)或者元素(elem)添加到列表(lst)头部 List
list ::: list2 合并List List
set | set2
set & set2
set &~ set2
并集、交集、差集 Set
coll += elem
coll += (e1, e2, …)
coll ++= coll2
coll -= elem
coll -= (e1, e2, …)
coll --= coll2
添加或者删除元素,并将修改后的结果赋值给集合本身 可变集合
elem +=: coll
coll2 ++=: coll
在集合头部追加元素或集合 ArrayBuffer

参考资料

  1. https://docs.scala-lang.org/overviews/collections/overview.html
  2. https://docs.scala-lang.org/overviews/collections/trait-traversable.html
  3. https://docs.scala-lang.org/overviews/collections/trait-iterable.html

更多大数据系列文章可以参见个人 GitHub 开源项目: 程序员大数据入门指南

Scala 学习之路(五)—— 集合类型综述的更多相关文章

  1. redis 学习(6)-- 集合类型

    redis 学习(6)-- 集合类型 set 结构 无序 无重复 集合间操作 set 集合内操作 命令 含义 sadd key memebr1 [member2...] 向集合中添加一个或多个成员 s ...

  2. Scala 系列(五)—— 集合类型综述

    一.集合简介 Scala中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改.即可以更改,添加,删除集合中的元素: 不可变集合类:不能被修改.对集合执行更改,添加或删除操作 ...

  3. scala学习手记17 - 容器和类型推断

    关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...

  4. Scala 学习之路(六)—— 常用集合类型之 List & Set

    一.List字面量 List是Scala中非常重要的一个数据结构,其与Array(数组)非常类似,但是List是不可变的,和Java中的List一样,其底层实现是链表. scala> val l ...

  5. Scala 学习之路(七)—— 常用集合类型之 Map & Tuple

    一.映射(Map) 1.1 构造Map // 初始化一个空map val scores01 = new HashMap[String, Int] // 从指定的值初始化Map(方式一) val sco ...

  6. Scala学习之路 (四)Scala的数组、映射、元组、集合

    一.数组 1.定长数组和变长数组 import scala.collection.mutable.ArrayBuffer object TestScala { def main(args: Array ...

  7. Scala学习笔记(五)—— 元组和集合

    1. 映射 映射Java中的Map,即Key/Value的数据形式 映射的创建,有以下两种方法 scala> val map =Map("Lisa" -> 90 , & ...

  8. Scala学习之路 (五)Scala的关键字Lazy

    Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载). 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量. 在Java中,要实现延迟加载(懒加载),需要自己手动 ...

  9. Scala学习之路----基础入门

    一.Scala解释器的使用 REPL:Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环) scala解释器也被称为REPL,会快速编译s ...

随机推荐

  1. wpf控件设计时支持(3)

    原文:wpf控件设计时支持(3) wpf设计时调试 编辑模型 装饰器 1.wpf设计时调试 为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码 (1)将启动项目配 ...

  2. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 动作结果 前面的章节中,我们一直使用简单的 C# 类作为控制器. 虽 ...

  3. WPF3D绘图的基础

    原文:WPF3D绘图的基础 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/69487096 ...

  4. linux下一个C语言要求CPU采用

    部分   从灾难中 本来我想写一个小程序来测试CPU其他工具利用它可以检验类数据的性能.以后参考IPbench中间cpu_target_lukem插件实现我们的功能.原理非常简单:就是我们给程序设置了 ...

  5. CefSharp For WPF自定义右键菜单栏

    原文:CefSharp For WPF自定义右键菜单栏 初始化 <!--浏览器--> <cefSharpWPF:ChromiumWebBrowser Name="webBr ...

  6. Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直认为地图应用支持离线地图非常重要啊.我等移动2G屌丝,流量不易 ...

  7. 食谱API自由和开放接口-为了发展自己的健康厨房APP应用

    什么时候健康厨房 (cook.yi18.net)上线后,基于接口的须要,就非常快就完毕的食谱API接口的开发 文档地址:http://doc.yi18.net/cookapidoc 菜谱食谱API , ...

  8. asp .net 大文件传输配置

    asp .net config配置 需要在配置文件里面设置文件上传限定的两个属性值:maxAllowedContentLength,maxRequestLength 允许上传文件的长度,和请求的长度, ...

  9. httpclient POST请求(urlencoded)

    搬砖搬砖~ Content-Type:application/x-www-form-urlencoded的请求如下 var nvc = new List<KeyValuePair<stri ...

  10. Ogre 1.7.0,VS2005编译全过程傻瓜式教程

    最近下了最新版Ogre 1.7.0,从下载到最后编译运行成功Ogre自带的Sample花了将近一下午时间. 网上有很多编译Ogre的教程,这里整理我看过的教程,加上自己的经验再详细总结一遍. 第一步: ...