天天看点

【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,如需转载请自行联系原作者