scala.collection包含可变和不可变。eg:collection.IndexedSeq[T]] 就是 collection.immutable.IndexedSeq[T]和collection.mutable.IndexedSeq[T]这两类的超类,只是mutable包在immutable包的基础上添加了一些辅助性的修改操作。
Traversable(遍历)是容器(collection)类的最高级别特性(trait),它唯一的抽象操作是foreach:
def foreach[U](f: Elem => U)
需要实现Traversable的容器(collection)类仅仅需要定义与之相关的方法,其他所有方法可都可以从Traversable中继承。
foreach方法用于遍历容器(collection)内的所有元素和每个元素进行指定的操作(比如说f操作)。操作类型是Elem => U,其中Elem是容器(collection)中元素的类型,U是一个任意的返回值类型。对f的调用仅仅是容器遍历的副作用,实际上所有函数f的计算结果都被foreach抛弃了。
Traversable同时定义的很多具体方法,如下表所示。这些方法可以划分为以下类别:
容器(collection)结构的上层还有另一个trait。这个trait里所有方法的定义都基于一个抽象方法,迭代器(iterator,会逐一的产生集合的所有元素)。从Traversable trait里继承来的foreach方法在这里也是利用iterator实现。下面是具体的实现。
def foreach[U](f: Elem => U): Unit = {
val it = iterator
while (it.hasNext) f(it.next())
}
foreach是Traversable所有操作的基础,所以它的性能表现很关键。
Iterable有两个方法返回迭代器:grouped和sliding。这些迭代器返回的不是单个元素,而是原容器(collection)元素的全部子序列。grouped方法返回元素的增量分块,sliding方法生成一个滑动元素的窗口。
抽象方法: | |
---|---|
xs.iterator | xs迭代器生成的每一个元素,以相同的顺序就像foreach一样遍历元素 |
其他迭代器: | |
xs grouped size | 一个迭代器生成一个固定大小的容器(collection)块 |
xs sliding size | 一个迭代器生成一个固定大小的滑动窗口作为容器(collection)的元素 |
子容器(Subcollection): | |
xs takeRight n | 一个由xs的最后n个元素组成的collection(若定义的元素是无序,则由任意的n个元素组成) |
xs dropRight n | 一个由除了xs被取走(执行takeRight()方法) n个元素外的其余元素组成的collection |
拉链方法(Zippers): | |
xs zip ys | 把一对容器 xs和ys的包含的元素合成到一个iterabale |
xs zipAll(ys, x, y) | 一对容器 xs 和ys的相应的元素合并到一个iterable ,实现方式是通过附加的元素x或y,把短的序列被延展到相对更长的一个上 |
xs.zip WithIndex | 把一对容器xs和它的序列,所包含的元素组成一个iterable |
比对: | |
xs sameElements ys | 测试 xs 和 ys 是否以相同的顺序包含相同的元素 |
REPL:
//iterator
scala> val a = List(1,2,3,4,5)
a: List[Int] = List(1, 2, 3, 4, 5)
scala> val aIterator = a.iterator
aIterator: Iterator[Int] = <iterator>
scala> aIterator.next()
res3: Int = 1
scala> aIterator.next()
res4: Int = 2
//grouped
scala> val a = List(1,2,3,4,5)
a: List[Int] = List(1, 2, 3, 4, 5)
scala> val aIterator = a grouped 2
aIterator: Iterator[List[Int]] = <iterator>
scala> aIterator.next()
res0: List[Int] = List(1, 2)
scala> aIterator.next()
res1: List[Int] = List(3, 4)
scala> aIterator.next()
res2: List[Int] = List(5)
//sliding
scala> val aIterator = a sliding 2
aIterator: Iterator[List[Int]] = <iterator>
scala> aIterator.next()
res5: List[Int] = List(1, 2)
scala> aIterator.next()
res6: List[Int] = List(2, 3)
scala> aIterator.next()
res7: List[Int] = List(3, 4)
//takeRight
scala> val aSubcollection = a takeRight 3
aSubcollection: List[Int] = List(3, 4, 5)
//dropRight
scala> val aSubcollection = a dropRight 2
aSubcollection: List[Int] = List(1, 2, 3)
scala> val aSubcollection = a dropRight 3
aSubcollection: List[Int] = List(1, 2)
//zip
scala> val b = List("a","b","c","d","e","f")
b: List[String] = List(a, b, c, d, e, f)
scala> val sum = a zip b
sum: List[(Int, String)] = List((1,a), (2,b), (3,c), (4,d), (5,e)) //这里结果舍去了 “f”
//zipAll
scala> val sumAll = a zipAll(b,6,"z")
sumAll: List[(Int, String)] = List((1,a), (2,b), (3,c), (4,d), (5,e), (6,f))
//zipWithIndex
scala> b.zipWithIndex
res9: List[(String, Int)] = List((a,0), (b,1), (c,2), (d,3), (e,4), (f,5))
//sameElements
scala> a sameElements b
res10: Boolean = false
原文:https://www.cnblogs.com/hanhande/p/12620618.html