Iterableトレイト | 目次 |
コレクション階層のトップの次はイテラブル(Iterable)です。 このトレイトの全てのメソッドはコレクションの要素を1つづつ返す抽象メソッドiteratorに基づいて定義されています。 トレイトTraversableのforeachメソッドはIterableではiteratorに基いて実装されています。 これが実際の実装です:
def foreach[U](f: Elem => U): Unit = {
val it = iterator
while (it.hasNext) f(it.next())
}
より効率的な実装を提供するために、Iterableの多くのサブクラスはこのIterableでのforeachの実装を上書きします。 foreachはTraversableでの全ての演算の基礎となっているのを思い出してください。 その効率は重要なのです。
Iterableにはイテレータを返すメソッドがあと2つあります: groupedとslidingです。 ただしこれらのイテレータは1つの要素を返すのではなく、元のコレクションの部分列を返します。 それらの部分列の最大サイズはメソッドの引数として与えられます。 groupedは要素を「かたまりにした」増分として返し、 slidingは要素のスライド「窓」を返します。 両者の違いはは以下のREPLのインタラクションを見るとはっきりします:
IteratorトレイトはさらにTraversableに対して、イテレータがある場合にのみ効率的に実装できるメソッドを追加します。 それらは以下の表にまとめられます。scala> val xs = List(1, 2, 3, 4, 5)
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)
何であるか | 何をするか |
---|---|
抽象メソッド: | |
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 | xsとysの対応する要素のペアのイテラブル。 |
xs zipAll (ys, x, y) | xsとysの対応する要素のペアのイテラブルで、 短い方の列はxまたはyを追加して長い方に合うように拡張される。 |
xs.zipWithIndex | xsの要素とその添字のペアのイテラブル。 |
比較: | |
xs sameElements ys | xsとysが同じ要素を同じ順で含むか調べる。 |
継承階層でIterableの下には3つのトレイトが見付かります: Seq, Set, そしてMapです。 これらの3つのトレイトに共通する特徴はapplyとisDefinedAtメソッドにより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
Iterableトレイト | 目次 |