2.8. java.lang.Iterable。イテレーターを使える目印。

Iterableはイテレーターを使用できるクラスで実現するインタフェースになります。

(Iter:イテレーター + able:できる = イテレーターを使うことができる)

つまり、イテレーターを使える目印になっています。

ですので、イテレーターを取得できる、ArrayListやHashSetなどはこれの対象です。

では、どのようなになっている見ていきたいと思います。

2.8.1. クラス図へ変換

では、早速クラス図にしてみましょう。

UML変換くんを実行。

> touml .\java\lang\Iterable.java -o d:\temp\

※java1.8コード

※「-o d:temp」はクラス図の出力先です。

2.8.1.1. パッケージ図

../_images/java.lang.Iterable.image001.jpg

パッケージ図はこれです。

Iterableはlang内にあり、関連するpackageはこんな感じでした。

2.8.1.2. クラス図

2.8.1.2.1. Iterable。ターゲットのクラスです。

../_images/java.lang.Iterable.svg

元の図は大きいので小さく切り取って、見ていきます。

2.8.3. フィールドを眺めてみる。

../_images/java.lang.Iterable.image002.jpg

Iterableにフィールドはありません。

2.8.4. メソッドを眺めてみる。

2.8.4.1. iterator

~iterator():Iterator<T>

抽象メソッドなので実装はありません。子クラスがオーバーライドします。

イテレーターを取得するメソッドです。

iterator :繰り返し処理に使うもの、反復子。(iterate:繰り返す +or:使うもの)

2.8.4.2. forEach

~forEach(action:Consumer<?super T>):void

これは、defaultメソッドですので、処理が実装されています。

※defaultメソッドはjava1.8から追加された機能で、インタフェースに実装を書けます。

戻り値のない関数型インタフェースを引数にセットすると、for each(for文拡張)のようにforループを実行する。

つまりはfor構文ではなく、メソッドでfor eachを再現したものです。

※Consumerのvoid accept(T t)をオーバーライドします。

2.8.4.3. spliterator

~spliterator():Spliterator<T>

これは、defaultメソッドですので、処理が実装されています。

※defaultメソッドはjava1.8から追加された機能で、インタフェースに実装を書けます。

イテレーターの一種である、スプリッテレーターを返します。

処理は下記のようにSpliteratorsクラスのstaticメソッドに処理を丸投げしています。

※return Spliterators.spliteratorUnknownSize(iterator(), 0);

※イテレーターの一種です。イテレーターが扱う集合を簡単に分(split)けられます。分割したものを並列処理したりするときに便利です。

2.8.5. まとめ

Iterableは三つしかメソッドがありませんでした。

イテレーターを使えることを表すものは、このぐらいのメソッドで十分なのでしょう。