拡張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が出てこないんだよなー。あきらめて普通に作ろう。