時間効率のよい方法で、多数の項目を書き込み、Java関数iterator.next()は要素をソースから削除できますか? (Java)の
public <T> void batchWrite(Iterable<T> source, int number)
があります。
batchWrite()
が書かれているConcurrentLinkedQueue
にこのbatchWrite()
を使用します。 batchWrite()
には、キューから取得する項目を削除する必要があります。
私は戻された項目を削除しますそのイテレータを書く(およびIterable
にそれをラップする)ことができます。
class IteratorThatRemovesReturnedValues<T> implements Iterator<T> {
Queue<T> queue;
IteratorThatRemovesReturnedValues(Queue<T> q) { queue = q; }
boolean hasNext() { return queue.peek() != null; }
T next() { return queue.poll(); }
}
質問です:はそれがコンセプトの乱用ではないでしょうか?
remove()
の説明は言う:反復がこの(remove()
)メソッドを呼び出すこと以外の方法で進行中に基礎となるコレクションが変更された場合、イテレータの 動作は不定です。 これはいずれの方法でも読み取ることができます。Iterator
の特定の実装では、基本的な待ち時間のないキューが特定の方法で変更された場合の動作を定義することができます。
戻り値の要素を基になるキューから削除すると、イテレータのコントラクトと矛盾しますか?
(代替補助ArrayList
にpoll()
にアイテムの量であり、そのリストにbatchWrite()
を呼び出す。)
EDITこの問題の反対側:する反復子は、配管によってバックアップすることができます?
IMO削除された項目を返すIteratorを実装せずに 'LinkedList'で同じことをすることができます... –
はい、それは悪用されるでしょう。イテレータのnext()メソッドは削除されません。キューのイテレータを使用してremove()を呼び出すのはなぜですか? –
完全に準拠したIteratorは、removeが呼び出されていないときに要素を削除すべきではないと言います。同じコレクションに対して2つのイテレータを作成し、両方を反復処理したいとします。 *ブーム*。 契約のあることは、特定の動作が期待できることです。あなたのイテレータが実際に 'IteratorThatRemovesReturnedValues'と呼ばれ、あなたが何を期待するのかを知るような振る舞いを文書化すれば、公式の意図した契約について心配することはありません。 – stuXnet