2011-09-28 103 views
2

是否有一些接口允許迭代數組和java.util.Lists?Java數組和foreach迭代實現

看到for-each循環如何遍歷這兩個循環,在我看來,必須存在某種在兩種情況下遍歷的基「可迭代」。

所以,我可以設置一個方法參數,接受Foo []或列表?

我們有很多舊代碼(我們不會更新),它調用了一些期望數組的低級方法(我想更新)。

我們的新代碼是使用List的toArray方法從Lists(特別是ArrayLists大部分時間)轉換爲數組,並且我希望能夠跳過這一步。

我見過this顯示實現的帖子,但我不確定它可能會有什麼幫助。

可以這樣做嗎?

+0

[這個問題有幾個選項(http://stackoverflow.com/questions/3912765/iterator-for-array)。 –

回答

4

不,語言規範顯式地分別調出數組。數組不執行Iterable<T>,這是增強型for循環使用的「常規」接口,而不是數組。從section 14.14.2 of the JLS

增強for語句的形式爲:

EnhancedForStatement: 
     for (VariableModifiers Type Identifier: Expression) Statement 

表達必須要麼具有類型Iterable否則它必須是一個數組類型(§10.1)或編譯期的發生時間錯誤。

這兩種情況,然後單獨處理。

從數組轉換爲表很容易,當然 - 但它聽起來像你需要做到這一點倒過來。這樣做真的沒有「愉快」的方式 - 當然,創建陣列需要複製所有內容。

多少工作將至少使用列表API的使用最頻繁的轉換位?

你可以寫,當然方法重載,例如

public void foo(String[] array) 
{ 
    foo(Arrays.asList(array)); 
} 

public void foo(List<String> list) 
{ 
    // Use the list 
} 

...但這樣做對你的舊代碼仍然會涉及到工作,真正實施是在列表中,而不是數組的條款。

+0

- 謝謝。你知道如果Arrays.asList比List.toArray'便宜'嗎?我試着用Google搜索這個話題,但還沒有看到任何幫助。 – rediVider

+0

@rediVider:是:'Arrays.asList'提供一個由*現有數組支持的列表*,即不涉及複製的視圖。 'List.toArray'必須複製所有的數據。 –

0

我認爲陣列只是特殊的套管在for循環的實現。

一兩件事你可以做的是超載方法:

public void foo(MyClass[] stuff) { 
    foo(Arrays.asList(stuff)); 
} 

public void foo(Collection<MyClass> stuff) { 
    // stuff 
} 

或者周圍的其他方式:

public void foo(MyClass[] stuff) { 
    // stuff 
} 

public void foo(Collection<MyClass> stuff) { 
    foo(stuff.toArray(new MyClass[stuff.size()])); 
} 
0

沒有這樣一個共同的接口,Array沒有實現Iterable

你可以做的是重載你方法:

public void mymethod(String ... strings) { 
    mymethod(Arrays.asList(strings)); 
} 

public void mymethod(List<String> strings) { 
    // do what you need 
} 
1

的Java可以做出Foo[]Iterable<Foo>亞型;不幸的是,這對原始數組不起作用,因爲Java不支持原始類型參數,所以我們沒有這種精確性。