Iterableで範囲for
Javaで、Iterableを実装すると拡張forが書けることを知ったので
範囲に関するイテレーションのためのクラスRangeを書いてみた。
Rubyほど簡単にはならないが、少し書きやすくなることがわかる。
参考:RubyのRangeクラス
http://www.ruby-lang.org/ja/man/html/Range.html
package hoge; import java.util.Iterator; import java.util.NoSuchElementException; public class Range implements Iterable<Integer> { public static void main(String[] args) { for(int i : new Range(3,5)){ System.out.println(i); } for(int i : range(100,200)){ System.out.println(i); } //0-9 for(int i : times(10)){ System.out.println(i); } } final int min; final int max; public Range(int min, int max) { super(); this.min = min; this.max = max; } //staticインポートでnewいらず public static Range range(int min, int max){ return new Range(min, max); } //0 - n-1 public static Range times(int n){ return new Range(0, n - 1); } @Override public Iterator<Integer> iterator() { return new Iterator<Integer>(){ int i = min; @Override public boolean hasNext() { return i <= max; } @Override public Integer next() { if(!hasNext()){ throw new NoSuchElementException(); } return i++; } @Override public void remove() { throw new UnsupportedOperationException("remove not supported"); } }; } public int getMin() { return min; } public int getMax() { return max; } }
これで条件i < (max + 1)を書かなくてすむ。
staticインポートすればnewなしで書ける。