凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 22050
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

今回はJavaのトリビアです。

JavaSE5.0からfor-each構文が使えるようになりました。

List<String> list;
for (String str : list) {
    // ...
}

上記のようなコードになるのですが、for-eachでループを書くには対象となるコレクションが java.lang.Iterableを実装している必要があります。

java.util.ListインターフェースはIterableインターフェースのサブインターフェースとして 定義されていますから、Listの実装は全てfor-eachでループさせることができます。

このIterableインターフェースですが、定義されているメソッドは
Iterator iterator()
というものだけです。つまり、Iterableであるということはjava.util.Iteratorを返すことが出来るということを意味します。

Iterator自身はIterableではない!

Iteratorインターフェースを使うことで順番にオブジェクトが取得できるわけですが、 このIterator自身はIterableではないのでfor-each構文でループさせることが出来ません。 自前でIteratorの継承クラスを作った場合、そのままではfor-eachでループさせられないのです。

そこで自前のIteratorにIterableもimplementsしてやり、thisを返すようにしてやります。

import java.util.Iterator;

public class SampleIterator implements Iterator<String>, Iterable<String> {

    /** @see java.lang.Iterable#iterator() */
    public Iterator<String> iterator() {
        // 自分自身を帰すことでfor-eachでループできるようにする
        return this;
    }

    /** @see java.util.Iterator#hasNext() */
    public boolean hasNext() {
        // ... (略)
    }

    /** @see java.util.Iterator#next() */
    public String next() {
        // ... (略)
    }

    /** @see java.util.Iterator#remove() */
    public void remove() {
        // ... (略)
    }
}

このようにしてやらないとfor-eachでループできないのです。なんだか不思議ですね。

投稿日時 : 2007年9月20日 12:52
コメント
タイトル  
名前  
Url
コメント