
在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,如需轉載請自行聯系原作者