Java で反復子を返す関数で for each ループを使用するにはどうすればよいですか? たとえば、次のシグネチャを持つ関数に for-each ループを使用したいと思います。
public Iterator<Integer> intIterator();
それは可能ですか、それとも通常の for ループを使用する必要がありますか?
残念ながら、Java の for-each は を必要とするように定義されておりIterable
、は必要ありIterator
ませんIterable
。これは、たとえば、ツリーに 3 種類のイテレータを提供したい場合や、データ構造に対して前方および後方イテレータを提供したい場合に、面倒な作業になる可能性があります。
最も簡単な方法は、通常の for ループを使用することですが、必要に応じて、次のようにラッパー クラスを記述できます。
public class IteratorWrapper<E> implements Iterable<E> {
private Iterator<E> iterator;
public IteratorWrapper(Iterator<E> iterator) {
this.iterator = iterator;
}
public Iterator<E> iterator() {
return iterator;
}
// Static import the following method for less typing at the
// call sites.
public static <E> IteratorWrapper<E> wrapIter(Iterator<E> iterator) {
return new IteratorWrapper<E>(iterator);
}
}
他の人が言ったように、イテレータを直接使用することはできません。
別の関数を作成します:
public Iterable<Integer> intIterable() {
return new Iterable<Integer>() {
@Override
public Iterator<Integer> iterator() {
return intIterator();
}
}
}
for-each ループで使用する
for ( Integer int : object.intIterable() ) {
}
for-each
loop は、配列または のインスタンスに対してのみ反復できますjava.lang.Iterable
。あなたはそれを行うことはできません。
次のように繰り返すことができます-
Iterator<Integer> iterator = intIterator();
for (; iterator.hasNext();) {
Integer type = iterator.next();
}