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。
        接下来,我们将会详细介绍这三种类型的集合。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值