SCALA 集合框架文档翻译-Trait Iterable

Iterable 特质


        在SCALA集合层级中顶端特质 Traversable 的下一个特质是 Iterable。这个特质中的所有方法都是依据抽象方法 iterator 而实现的,这个抽象方法能一个接一个产生集合中的元素。Traversable 特质中的 foreach 方法在 Iterable 中也是依据 iterator 方法实现的。下面是实现的代码:

def foreach[U](f: Elem => U): Unit = {
  val it = iterator
  while(it.hasNext) f(it.next())
}

        相当多 Iterable 的子类会重写 Iterable 中 foreach 的标准实现,这是因为他们可以提供更加高效的实现方式。要知道 foreach 方法是 Traversable 特质中所有操作实现的基础,所以它的性能非常重要。

        Iterable 特质中还有两个方法返回迭代器:grouped 和 sliding。但是,这些迭代器不能返回单个元素而是当前集合的元素的子序列。这些序列的最大长度作为方法的参数。grouped 方法以“块”的方式返回元素块,而 sliding 方法在所有元素上生成一个滑动窗口。下面这段REPL上尝试的代码可以很好地说明这两个方法之间的差异:

scala> val xs = List(1,2,3,4,5)
xs: List[Int] = List(1,2,3,4,5)
scala> val git = xs grouped 3
git: Iterator[List[Int]] = non-empty iterator
scala> git.next()
res3: List[Int] = List(1,2,3)
scala> git.next()
res4: List[Int] = List(4,5)
scala> val sit = xs sliding 3
sit: Iterable[List[Int]] = non-empty iterator
scala> sit.next()
res5: List[Int] = List(1,2,3)
scala> sit.next()
res5: List[Int] = List(2,3,4)
scala> sit.next()
res5: List[Int] = List(3,4,5)

        Iterable 特质还在 Traversable 的基础上添加了一些其他方法,这些方法在 iterator 可用时能够被高效地实现。Iterable 中的方法总结如下表。


Iterable 特质中的方法

方法 作用
   
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 中除了 xs takeRight 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 集合继承层级中,Iterable 特质下面是: Seq, Set 以及 Map。这三个特质有一个共同点是他们都实现了 PartialFunction 特质的apply方法和isDefinedAt方法。但是,他们的具体实现方式各不相同。
        对于Seq来说,apply 用来根据位置索引定位元素,参数总是从 0 开始的自然数。比如说,Seq(1,2,3)(1) 返回 2。对于 Set 而言,apply 方法用于判断给定元素是否属于当前集合。例如,Set('a', 'b', 'c') ('b') 返回 true,而 Set()('a') 返回 false。最后对于Map,apply 方法是一个选择操作。例如,Map('a'->1, 'b'->10, 'c'->100)('b') 返回 10。
        接下来,我们将会详细介绍这三种类型的集合。


你可能感兴趣的:(SCALA,scala,泛型,多核,SBT,迭代器)