16 KiB
集合
一、集合简介二、集合结构
3.1 scala.collection
3.2 scala.collection.mutable
3.2 scala.collection.immutable
三、Trait Traversable
四、Trait Iterable
五、修改集合
一、集合简介
Scala中拥有多种集合类型,主要分为可变的和不可变的集合两大类:
-
可变集合: 可以被修改。即可以更改,添加,删除集合中的元素;
-
不可变集合类:不能被修改。虽然可以对不可变集合执行添加,移除或更新操作,但是这些操作都会返回一个新的集合,而不是修改原来的集合。
二、集合结构
scala所有的集合类主要位于scala.collection 、scala.collection.mutable、scala.collection.immutable、scala.collection.generic包中 ,大部分集合类存在三类变体,分别位于scala.collection, scala.collection.immutable, scala.collection.mutable包。
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中定义了很多方法,如下:
下面表格来源于官方文档:https://docs.scala-lang.org/overviews/collections/trait-traversable.html
| 方法 | 描述 |
|---|---|
| Abstract Method: | |
xs foreach f |
Executes function f for every element of xs. |
| Addition: | |
xs ++ ys |
A collection consisting of the elements of both xs and ys. ys is a TraversableOnce collection, i.e., either a Traversable or an Iterator. |
| Maps: | |
xs map f |
The collection obtained from applying the function f to every element in xs. |
xs flatMap f |
The collection obtained from applying the collection-valued function f to every element in xs and concatenating the results. |
xs collect f |
The collection obtained from applying the partial function f to every element in xs for which it is defined and collecting the results. |
| Conversions: | |
xs.toArray |
Converts the collection to an array. |
xs.toList |
Converts the collection to a list. |
xs.toIterable |
Converts the collection to an iterable. |
xs.toSeq |
Converts the collection to a sequence. |
xs.toIndexedSeq |
Converts the collection to an indexed sequence. |
xs.toStream |
Converts the collection to a lazily computed stream. |
xs.toSet |
Converts the collection to a set. |
xs.toMap |
Converts the collection of key/value pairs to a map. If the collection does not have pairs as elements, calling this operation results in a static type error. |
| Copying: | |
xs copyToBuffer buf |
Copies all elements of the collection to buffer buf. |
xs copyToArray(arr, s, n) |
Copies at most n elements of the collection to array arr starting at index s. The last two arguments are optional. |
| Size info: | |
xs.isEmpty |
Tests whether the collection is empty. |
xs.nonEmpty |
Tests whether the collection contains elements. |
xs.size |
The number of elements in the collection. |
xs.hasDefiniteSize |
True if xs is known to have finite size. |
| Element Retrieval: | |
xs.head |
The first element of the collection (or, some element, if no order is defined). |
xs.headOption |
The first element of xs in an option value, or None if xs is empty. |
xs.last |
The last element of the collection (or, some element, if no order is defined). |
xs.lastOption |
The last element of xs in an option value, or None if xs is empty. |
xs find p |
An option containing the first element in xs that satisfies p, or None if no element qualifies. |
| Subcollections: | |
xs.tail |
The rest of the collection except xs.head. |
xs.init |
The rest of the collection except xs.last. |
xs slice (from, to) |
A collection consisting of elements in some index range of xs (from from up to, and excluding to). |
xs take n |
A collection consisting of the first n elements of xs (or, some arbitrary n elements, if no order is defined). |
xs drop n |
The rest of the collection except xs take n. |
xs takeWhile p |
The longest prefix of elements in the collection that all satisfy p. |
xs dropWhile p |
The collection without the longest prefix of elements that all satisfy p. |
xs filter p |
The collection consisting of those elements of xs that satisfy the predicate p. |
xs withFilter p |
A non-strict filter of this collection. Subsequent calls to map, flatMap, foreach, and withFilter will only apply to those elements of xs for which the condition p is true. |
xs filterNot p |
The collection consisting of those elements of xs that do not satisfy the predicate p. |
| Subdivisions: | |
xs splitAt n |
Split xs at a position, giving the pair of collections (xs take n, xs drop n). |
xs span p |
Split xs according to a predicate, giving the pair of collections (xs takeWhile p, xs.dropWhile p). |
xs partition p |
Split xs into a pair of collections; one with elements that satisfy the predicate p, the other with elements that do not, giving the pair of collections (xs filter p, xs.filterNot p) |
xs groupBy f |
Partition xs into a map of collections according to a discriminator function f. |
| Element Conditions: | |
xs forall p |
A boolean indicating whether the predicate p holds for all elements of xs. |
xs exists p |
A boolean indicating whether the predicate p holds for some element in xs. |
xs count p |
The number of elements in xs that satisfy the predicate p. |
| Folds: | |
(z /: xs)(op) |
Apply binary operation op between successive elements of xs, going left to right and starting with z. |
(xs :\ z)(op) |
Apply binary operation op between successive elements of xs, going right to left and starting with z. |
xs.foldLeft(z)(op) |
Same as (z /: xs)(op). |
xs.foldRight(z)(op) |
Same as (xs :\ z)(op). |
xs reduceLeft op |
Apply binary operation op between successive elements of non-empty collection xs, going left to right. |
xs reduceRight op |
Apply binary operation op between successive elements of non-empty collection xs, going right to left. |
| Specific Folds: | |
xs.sum |
The sum of the numeric element values of collection xs. |
xs.product |
The product of the numeric element values of collection xs. |
xs.min |
The minimum of the ordered element values of collection xs. |
xs.max |
The maximum of the ordered element values of collection xs. |
| Strings: | |
xs addString (b, start, sep, end) |
Adds a string to StringBuilder b that shows all elements of xs between separators sep enclosed in strings start and end. start, sep, end are all optional. |
xs mkString (start, sep, end) |
Converts the collection to a string that shows all elements of xs between separators sep enclosed in strings start and end. start, sep, end are all optional. |
xs.stringPrefix |
The collection name at the beginning of the string returned from xs.toString. |
| Views: | |
xs.view |
Produces a view over xs. |
xs view (from, to) |
Produces a view that represents the elements in some index range of xs. |
四、Trait Iterable
Iterable拓展了Traversable,并定义了一些额外的方法,Scala中所有的集合都直接或者间接实现了Iterable。
下面表格来源于官方文档:https://docs.scala-lang.org/overviews/collections/trait-iterable.html
| 方法 | 描述 |
|---|---|
| Abstract Method: | |
xs.iterator |
An iterator that yields every element in xs, in the same order as foreach traverses elements. |
| Other Iterators: | |
xs grouped size |
An iterator that yields fixed-sized “chunks” of this collection. |
xs sliding size |
An iterator that yields a sliding fixed-sized window of elements in this collection. |
| Subcollections: | |
xs takeRight n |
A collection consisting of the last n elements of xs (or, some arbitrary n elements, if no order is defined). |
xs dropRight n |
The rest of the collection except xs takeRight n. |
| Zippers: | |
xs zip ys |
An iterable of pairs of corresponding elements from xs and ys. |
xs zipAll (ys, x, y) |
An iterable of pairs of corresponding elements from xs and ys, where the shorter sequence is extended to match the longer one by appending elements x or y. |
xs.zipWithIndex |
An iterable of pairs of elements from xs with their indices. |
| Comparison: | |
xs sameElements ys |
A test whether xs and ys contain the same elements in the same order |
五、修改集合
当你想对集合添加或者删除元素,需要根据不同的集合类型选择不同的操作符号。
| 操作符 | 描述 | 集合类型 |
|---|---|---|
| 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 |
参考资料
- Martin Odersky . Scala编程(第3版)[M] . 电子工业出版社 . 2018-1-1
- 凯.S.霍斯特曼 . 快学Scala(第2版)[M] . 电子工业出版社 . 2017-7
- https://docs.scala-lang.org/overviews/collections/overview.html
- https://docs.scala-lang.org/overviews/collections/trait-traversable.html
- https://docs.scala-lang.org/overviews/collections/trait-iterable.html


