読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

拡張for文でループできるクラスのサンプル

java.lang.Iterableを実装すればOK。

/**
 * 拡張for文でループできるクラス
 */
class Test implements Iterable<String> {
    public Iterator<String> iterator () {
        return Arrays.asList( new String[] {
            "a", "b", "c"
        } ).iterator();
    }
}
for ( String str : new Test() ) {
    System.out.println( str );
}

実好結果です。

a
b
c


今検討中のAPIイテレータを返すのがあって、拡張for文で使えるようにしようかと思ったんだけど、いらなくなったらclose()しないといけないイテレータなんだよな。

/**
 * いらなくなったらcloseしないといけないイテレータ。
 */
interface TestIterator 
extends Iterator<String>, Closeable {}
  • Iterable実装クラスではとりあえずイテレータで返しておいて、
  • キャストしてTestIteratorにして破棄する

とかいう手を一瞬思いついたけど、

class Test2 implements Iterable<String> {
    public Iterator<String> iterator () {
        return new TestIterator() {
            private int index = 0;
            private String[] strs = new String[]{"a","b","c"};
            public boolean hasNext () {
                return index < strs.length;
            }
            public String next () {
                return strs[index++];
            }
            public void remove () {}
            public void close () throws IOException {}
        };
    }
}
Test2 test2 = new Test2(); 
for ( String str : test2 ) {
    System.out.println( str );
}
// あれ?

拡張for文だとキャストする以前にIteratorが出てこないんだよなー。あきらめて普通に作ろう。