可能性の重複:私はそうJavaがイテレータでforeachを許可しないのはなぜですか(イテラブルのみ)。
のJava 5で追加したシンタックスシュガーを知っているよう
Why is Java's Iterator not an Iterable?Idiomatic way to use for-each loop given an iterator?
Can we use for-each loop for iterating the objects of Iterator type?
foreachループは限りあります
Iterable<O> iterable;
for(O o : iterable) {
// Do something
}
は
(クラスが2つの異なるイテレータを提供していますので、例えば)私は最初の場所で反復可能な、唯一のイテレータを持っていない場合、基本的に、しかし
Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
O o = iter.next();
// Do something
}
と同じバイトコードを生成します、私はできませんsugar foreach loopという構文を使用します。当然のことながら、私はまだ古風なスタイルの繰り返しを行うことができます。しかし、私は実際にやってみたい:
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;
}
}
(実際には反復処理可能なAPIの醜い乱用されており、それができるように!
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
を中心に設計された場合は、1が面白いの数を行うことができます
誰でも知っていますかなぜ言語はこのように設計されていますか?クラスがIterator
とIterable
の両方を実装する場合のあいまいさを避けるには? "for(O o:iter)"がすべての要素を2回処理することを想定したプログラマエラーを避けるために(そして、新しいイテレータを忘れる)?それとも何か他の理由がありますか?
または、わからない言語のトリックはありますか?
[この1つ](http://stackoverflow.com/questions/2162917/can-we-use-for-each-loop-for-iterating-the-objects-of-iterator-type) –
どちらも重複していますが、完全に同じではありません。 IteratorはIterableであってはなりません。なぜなら、一度しか反復することができないからです( "再起動"しない)。 そして、あなたがイテレータでforeachを使用することはできないことを知っています(私が概説したアダプタを使用しない限り)が、なぜJavaがこのように設計されたのか理解しようとしています。 –
Meh;私は反対する傾向がある。 1.5の文書で与えられた答えは、デザイナーが最も一般的なユースケースを扱うためにこの方法を選んだということだけを述べています。時には答えは*です。 –