天天看點

【scala初學】Trait Iterable

【scala初學】Trait Iterable

   在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>&gt; 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&gt; </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&gt; </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&gt; 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&gt; </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&gt; 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' -&gt; 1, 'b' -&gt; 10, 'c' -&gt; 100)('b')</code> 傳回<code>10</code>

<code></code>

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/yjplxq/1429182,如需轉載請自行聯系原作者