重複の可能性:
Java の Iterator が Iterable でないのはなぜですか?
foreach ループは、私が知る限り、Java 5 で追加された構文シュガーです。
Iterable<O> iterable;
for(O o : iterable) {
// Do something
}
本質的に同じバイトコードを生成します
Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
O o = iter.next();
// Do something
}
しかし、そもそも iterable がなく、イテレーターしかない場合 (たとえば、クラスが 2 つの異なるイテレーターを提供するため)、構文シュガー foreach ループを使用することはできません。明らかに、私はまだ昔ながらのスタイルの反復を行うことができます. しかし、私は実際にやりたい:
Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
// Do something
}
そしてもちろん、私は偽物を作ることができますIterable
:
class Adapter<O> implements Iterable<O> {
Iterator<O> iter;
public Adapter(Iterator<O> iter) {
this.iter = iter;
}
@Override
public Iterator<O> iterator() {
return iter;
}
}
(実際、これは Iterable API の醜い悪用です。反復できるのは 1 回だけです!)
反復可能ではなく設計されている場合Iterator
、多くの興味深いことができます。
for(O o : iterable.iterator()) {} // Iterate over Iterable and Collections
for(O o : list.backwardsIterator()) {} // Or backwards
Iterator<O> iter;
for(O o : iter) {
if (o.something()) { iter.remove(); }
if (o.something()) { break; }
}
for(O : iter) { } // Do something with the remaining elements only.
言語がこのように設計された理由を誰か知っていますか? Iterator
クラスが と の両方を実装する場合のあいまいさを避けるにはIterable
? 「for(O o : iter)」がすべての要素を 2 回処理する (そして新しい反復子を取得するのを忘れる) と想定するプログラマーのエラーを回避するには? それとも、これには別の理由がありますか?
または、私が知らない言語のトリックはありますか?