2017-02-03 15 views
-1

これは間違いありません。私はIteratorを使用しようとしたとき、IntelliJはIteratorが型パラメータを持つことができないと警告しています。これは真実ではありません。効率的なリストの操作方法

どういうわけか、IntelliJがjava 1.4のjavadocを表示しているようです。私はまだそれを修正しようとしています。ありがとう。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^

私は、APIからListを返すjavaプログラムを開発しました。この取り扱いの

私の方法は次のとおりです。

ArrayList<SomeObject> arrayList = new ArrayList<>(apiThatReturnsAList); 
for (SomeObject someObject : arrayList) { 
    ... 
} 

私のコードレビューアは、これはそれをコピーデータので、それに対処するためのより少ない効率的な方法であるかもしれない示唆しています。彼はIteratorを使うことを勧めました。しかし、私は、コードは次のようになります見つける:

Iterator iterator = apiThatReturnsAList.iterator(); 
while (iterator.hasNext()) { 
    SomeObject someObject = (SomeObject)iterator.next(); 
} 

すると、それは安全ではありませんので、我々は見たくない、ここで醜い鋳造があります。

したがって、このAPIを処理してデータをコピーしない効率的な方法はありますか?

ありがとうございます!

+0

ジェネリックを使用する必要があります。 – SLaks

+2

なぜあなたは 'List'をコピーする必要があると思いますか?あなたはなぜ**生の型** 'Iterator'を使っていますか?そしてなぜあなたは 'ArrayList'を直接参照していますか?私があなたの批評家であったなら、私はこの混乱についてかなりのコメントを持っていました。 –

+0

最初に返されたリストを反復するだけで何が問題になりますか? – GhostCat

答えて

4

をコピーを避けるために、あなたはapiThatReturnsAListためforeachを使用することができます

for (SomeObject someObject : apiThatReturnsAList) { 
    ... 
} 

実際には、foreachは、ボンネットの下にイテレータと同じ作業を行いJLS 14.14.2. The enhanced for statement

4

だけで、期待クラスを使用して、イテレータをパラメータ:

Iterator<SomeObject> iterator = apiThatReturnsAList.iterator(); 

、あなたがnext()を呼び出すときにSomeObjectインスタンスを取得します:

Iterator<SomeObject> iterator = apiThatReturnsAList.iterator(); 
while (iterator.hasNext()) { 
    SomeObject someObject = iterator.next(); 
} 
+0

イテレータには型パラメータがありますか? –

+2

@BoYuanああああ。本当に? [RTFM](https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html)。 –

+0

実際、私はこの質問をする前にこれをしました。私は追跡し、私の図書館でこれを見ない。そして、IntelliJはIteratorに型パラメータがないことを伝え続けます。 –

0

apiThatReturnsListの要素の内容を印刷するために、それぞれ使用します。

for (SomeObject element : apiThatReturnsList) { 
    System.out.println(element); 
} 

リストをコピーする必要はありません別のリストに入れる