在scala集合的整个层级结构,Iterable仅次于Traverable。
(书生注:原句:All methods in this trait are defined in terms of an an abstract method, 个人根据上下文,这里应该多了一个“an”)
Iterable中的所有方法借助一个抽象方法的被定义,该方法是: iterator, 它用于一个一个的产生集合元素。 继承于Traversable的foreach方法借助的iterator 实现如下:
1
2
3
4
|
def
foreach[U](f
:
Elem
=
> U)
:
Unit
=
{
val
it
=
iterator
while
(it.hasNext) f(it.next())
}
|
Iterable的相当一部分子类都重写了标准的foreach方法,因为他们能够提供更有效的实现。谨记foreach是Traversable所有方法实现的基础,他决定性能好坏。
Iterator中有两个以上的方法返回迭代器iterators: grouped 和 sliding。 然而这些iterators,不返回单独的元素,而是返回原始集合元素的子序列。这些子序列最大尺寸会作为一个参数给出到这些方法中。grouped以“块”增量的方式返回他的元素,sliding产生一个滑动“window”贯穿所有元素。下面通过REPL【 书生:----读取-求值-输出”循环(英语:Read-Eval-Print Loop,简称REPL) 】 的交互式,来让我们清楚的理解他们的区别:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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()
res
3
:
List[Int]
=
List(
1
,
2
,
3
)
scala> git.next()
res
4
:
List[Int]
=
List(
4
,
5
)
scala>
val
sit
=
xs sliding
3
sit
:
Iterator[List[Int]]
=
non-empty iterator
scala> sit.next()
res
5
:
List[Int]
=
List(
1
,
2
,
3
)
scala> sit.next()
res
6
:
List[Int]
=
List(
2
,
3
,
4
)
scala> sit.next()
res
7
:
List[Int]
=
List(
3
,
4
,
5
)
|
只要迭代器可用,Trait iterable 能够增加一些其他有效的实现到Traversable.
Trait Iterable中的操作
WHAT IT IS | WHAT IT DOES |
Abstract Method: | |
xs.iterator | 产生xs的任何元素的迭代器。与foreach遍历顺序相同 |
Other Iterators: | |
xs grouped size | 一个迭代器,用于产生这个集合固定大小的“块” |
xs sliding size | 一个迭代器,用于产生该集合元素的一个滑动固定大小的窗口 |
Subcollections: | |
xs takeRight n | xs最后n个元素组成的集合(又或者,如果没有顺序,返回任意n个元素) |
xs dropRight n | 除了 xs takeRight n 剩余的元素 |
Zippers: | |
xs zip ys | 返回 Iterable[(A, B)], 元素是 xs 和 ys中相应的元素对 |
xs zipAll (ys, x, y) | 返回Iterable[(A, B)],元素xs 和 ys中相应的元素对,较短的序列将会扩展用语匹配较长的序列,追加元素x 或者 y |
xs.zipWithIndex | 返回Iterable[(A, Int)], 通过他们的索引位置,形成一对元素 |
Comparison: | |
xs sameElements ys | 测试xs和ys以同样的顺序包含了同样的元素 |
在Trait Iterable下面的集成层次结构中,有三个Trait: Seq, Set, and 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 , 例子如下: Map('a' -> 1, 'b' -> 10, 'c' -> 100)('b')
返回10