列トレイトSeq, IndexedSeq, LinearSeqトップTraversableトレイトIterableトレイト目次

Iterableトレイト

コレクション階層のトップの次はイテラブル(Iterable)です。 このトレイトの全てのメソッドはコレクションの要素を1つづつ返す抽象メソッドiteratorに基づいて定義されています。 トレイトTraversableforeachメソッドはIterableではiteratorに基いて実装されています。 これが実際の実装です:

def foreach[U](f: Elem => U): Unit = {
  val it = iterator
  while (it.hasNext) f(it.next())

より効率的な実装を提供するために、Iterableの多くのサブクラスはこのIterableでのforeachの実装を上書きします。 foreachTraversableでの全ての演算の基礎となっているのを思い出してください。 その効率は重要なのです。

Iterableにはイテレータを返すメソッドがあと2つあります: groupedslidingです。 ただしこれらのイテレータは1つの要素を返すのではなく、元のコレクションの部分列を返します。 それらの部分列の最大サイズはメソッドの引数として与えられます。 groupedは要素を「かたまりにした」増分として返し、 slidingは要素のスライド「窓」を返します。 両者の違いはは以下のREPLのインタラクションを見るとはっきりします:

scala> val xs = List(12345)
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()
res3: List[Int] = List(1, 2, 3)
scala> git.next()
res4: List[Int] = List(4, 5)
scala> val sit = xs sliding 3
sit: Iterator[List[Int]] = non-empty iterator
scala> sit.next()
res5: List[Int] = List(1, 2, 3)
scala> sit.next()
res6: List[Int] = List(2, 3, 4)
scala> sit.next()
res7: List[Int] = List(3, 4, 5)
IteratorトレイトはさらにTraversableに対して、イテレータがある場合にのみ効率的に実装できるメソッドを追加します。 それらは以下の表にまとめられます。
クラスIterable内の演算
何であるか 何をするか
抽象メソッド:
xs.iterator xs内の全ての要素をforeachが要素を辿るのと同じ順で返すイテレータ。
その他のイテレータ:
xs grouped size このコレクションの固定長の「かたまり」を返すイテレータ。
xs sliding size このコレクション内の要素に対するスライド窓を返すイテレータ。
部分コレクション:
xs takeRight n xsの最後のn要素からなるコレクション(または順序が定義されていない場合は任意のn要素)。
xs dropRight n コレクションのxs takeRight n以外の部分。
ジッパー:
xs zip ys xsysの対応する要素のペアのイテラブル。
xs zipAll (ys, x, y) xsysの対応する要素のペアのイテラブルで、 短い方の列はxまたはyを追加して長い方に合うように拡張される。
xs.zipWithIndex xsの要素とその添字のペアのイテラブル。
比較:
xs sameElements ys xsysが同じ要素を同じ順で含むか調べる。

継承階層でIterableの下には3つのトレイトが見付かります: Seq, Set, そしてMapです。 これらの3つのトレイトに共通する特徴はapplyisDefinedAtメソッドによりPartialFunctionトレイトを実装しているという点です。 しかし各トレイトはPartialFunctionを異なった風に実装します。 列(Seq)の場合、applyは位置による添字付けであり、要素は0から番号付けられます。 つまり、Seq(1, 2, 3)(1)2となります。 集合(Set)の場合、applyは所属テストです。 例えばSet('a', 'b', 'c')('b')trueとなり、Set()('a')falseとなります。 最後にマップ(Map)の場合、applyは選択です。 例えばMap('a' -> 1, 'b' -> 10, 'c' -> 100)('b')10となります。

以降ではこの3種類のコレクションについてより詳しく説明します。

続いては: 列トレイトSeq, IndexedSeq, およびLinearSeq


列トレイトSeq, IndexedSeq, LinearSeqトップTraversableトレイトIterableトレイト目次