
在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
<code>def</code> <code>foreach[U](f</code><code>:</code> <code>Elem </code><code>=</code><code>> U)</code><code>:</code> <code>Unit </code><code>=</code> <code>{</code>
<code> </code><code>val</code> <code>it </code><code>=</code> <code>iterator</code>
<code> </code><code>while</code> <code>(it.hasNext) f(it.next())</code>
<code>}</code>
Iterable的相当一部分子类都重写了标准的foreach方法,因为他们能够提供更有效的实现。谨记foreach是Traversable所有方法实现的基础,他决定性能好坏。
Iterator中有两个以上的方法返回迭代器iterators: grouped 和 sliding。 然而这些iterators,不返回单独的元素,而是返回原始集合元素的子序列。这些子序列最大尺寸会作为一个参数给出到这些方法中。grouped以“块”增量的方式返回他的元素,sliding产生一个滑动“window”贯穿所有元素。下面通过REPL【 书生:----读取-求值-输出”循环(英语:Read-Eval-Print Loop,简称REPL) 】 的交互式,来让我们清楚的理解他们的区别:
5
6
7
8
9
10
11
12
13
14
15
16
<code>scala> </code><code>val</code> <code>xs </code><code>=</code> <code>List(</code><code>1</code><code>, </code><code>2</code><code>, </code><code>3</code><code>, </code><code>4</code><code>, </code><code>5</code><code>)</code>
<code>xs</code><code>:</code> <code>List[Int] </code><code>=</code> <code>List(</code><code>1</code><code>, </code><code>2</code><code>, </code><code>3</code><code>, </code><code>4</code><code>, </code><code>5</code><code>)</code>
<code>scala> </code><code>val</code> <code>git </code><code>=</code> <code>xs grouped </code><code>3</code>
<code>git</code><code>:</code> <code>Iterator[List[Int]] </code><code>=</code> <code>non-empty iterator</code>
<code>scala> git.next()</code>
<code>res</code><code>3</code><code>:</code> <code>List[Int] </code><code>=</code> <code>List(</code><code>1</code><code>, </code><code>2</code><code>, </code><code>3</code><code>)</code>
<code>res</code><code>4</code><code>:</code> <code>List[Int] </code><code>=</code> <code>List(</code><code>4</code><code>, </code><code>5</code><code>)</code>
<code>scala> </code><code>val</code> <code>sit </code><code>=</code> <code>xs sliding </code><code>3</code>
<code>sit</code><code>:</code> <code>Iterator[List[Int]] </code><code>=</code> <code>non-empty iterator</code>
<code>scala> sit.next()</code>
<code>res</code><code>5</code><code>:</code> <code>List[Int] </code><code>=</code> <code>List(</code><code>1</code><code>, </code><code>2</code><code>, </code><code>3</code><code>)</code>
<code>res</code><code>6</code><code>:</code> <code>List[Int] </code><code>=</code> <code>List(</code><code>2</code><code>, </code><code>3</code><code>, </code><code>4</code><code>)</code>
<code>res</code><code>7</code><code>:</code> <code>List[Int] </code><code>=</code> <code>List(</code><code>3</code><code>, </code><code>4</code><code>, </code><code>5</code><code>)</code>
只要迭代器可用,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
xs zipAll (ys, x, y)
xs.zipWithIndex
Comparison:
xs sameElements ys
测试xs和ys以同样的顺序包含了同样的元素
对于序列(Seq), apply是位置索引,启示是0. 即:Seq(1,2,3)(1) 结果是2.
对于Set, apply是对元素的测试 Set('a','b','c')('b')返回是true ,而Set()('a') 返回false.
对于Map , 例子如下: <code>Map('a' -> 1, 'b' -> 10, 'c' -> 100)('b')</code> 返回<code>10</code>
<code></code>
本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/yjplxq/1429182,如需转载请自行联系原作者