2017-02-03 47 views
-1

請注意這是一個錯誤的問題。我問了這個問題,因爲當我嘗試使用Iterator時,我的IntelliJ在「Iterator」上一直警告Iterator不能有類型參數,這是不正確的。使用清單的高效方式

不知何故,我的IntelliJ似乎顯示了Java 1.4的javadoc。我仍然試圖解決它。謝謝。

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

我在一個java程序中,一個api返回一個列表。

我處理這種方式是:

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

我的代碼評審表明,這可能是對付它,因爲它拷貝數據的效率較低的方式。他建議我使用迭代器。但我發現代碼會是這樣的:

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

有醜陋的鑄造在這裏,我們不想看到,因爲它不安全。

那麼,有沒有一種有效的方法來處理這個API,而不是複製數據?

謝謝!

+0

您應該使用泛型。 – SLaks

+2

爲什麼你認爲你需要複製'List'?任何你爲什麼使用** raw type **'Iterator'。你爲什麼直接引用一個'ArrayList'。如果我是你的評論者,我會對這個爛攤子有不少評論。 –

+0

簡單地迭代返回的列表首先出現什麼問題? – GhostCat

回答

4

爲了避免複製,你可以使用foreachapiThatReturnsAList

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一直告訴我迭代器沒有類型參數。 –

0

使用下與迭代器相同的工作,每個打印單元的內容在apiThatReturnsList

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

有沒有需要複製的清單進入另一個列表。