2009-07-20 51 views
463

比方說,我有一個方法m(),它將一個字符串數組作爲參數。有沒有辦法在我打電話時在線聲明這個數組?即相反的:任何方式來聲明一個數組內聯?

String[] strs = {"blah", "hey", "yo"}; 
m(strs); 

我可以只用一條線替換此,並且避免聲明名爲變量,我永遠不會使用?

+2

支持再保的IDE將允許你在 - 直線strs自動。 – 2009-07-20 21:12:47

回答

734
m(new String[]{"blah", "hey", "yo"}); 
+43

僅供將來參考,這種類型的數組被稱爲匿名數組(因爲它沒有名稱)。搜索「Anonymous array java」會產生一些結果。 – Falaina 2009-07-20 14:55:35

+1

它類似於鑄造。我想這就是我想到的,所以我不必一次就能在GoogleMoon中谷歌,我需要這樣做。 – ArtOfWarfare 2012-08-21 16:10:47

91

德拉蒙是正確的。您還可以聲明m如服用varargs

void m(String... strs) { 
    // strs is seen as a normal String[] inside the method 
} 

m("blah", "hey", "yo"); // no [] or {} needed; each string is a separate arg here 
+12

相當不錯的語法,但用這種方法只能有一個數組參數,並且它必須是最後一個。所以,你不能這樣做:`void m(String ... strs,Integer ... intgrs)`例如。 – bluefoot 2011-03-01 01:39:05

+5

白斑是正確的。但你可以做'void m(Integer i,Double d,String ... str)' – 2013-11-17 20:47:19

+0

@MichaelMyers'(String ... strs)'的含義是什麼? – 2016-07-12 03:22:23

2

我想補充的是,數組初始化語法非常簡潔和靈活。我用它從我的代碼中提取數據並將它放置在更加可用的地方。

舉個例子,我經常創建菜單是這樣的:

Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...}); 

這將讓我寫代碼來設置的菜單系統。 「+」足以告訴它將該項目放在前一項目下。

我可以將它綁定到menuHandler類,或者通過命名方法來命名我的方法,如「menuFile,menuFileSave,menuFileLoad,...」,並反射性地綁定它們(還有其他替代方法)。

此語法允許令人驚訝的簡短菜單定義和極其可重用的「initMenus」方法。 (但是我不打算重複使用它,因爲它總是很有趣,只需要幾分鐘+幾行代碼)。當你在你的代碼中看到一個模式時,看看你是否可以用這樣的東西替換它,並且始終記住數組初始化語法是多麼的簡潔!

1

由於Draemon說,該Java配套內聯陣列最接近的是new String[]{"blah", "hey", "yo"}但有一個巧妙的方法,可以讓你做這樣的事情

array("blah", "hey", "yo")與自動推斷類型。

我一直在研究一種有用的API來增強Java語言以允許內聯數組和集合類型。欲瞭解更多詳細信息,谷歌工程Espresso4J或檢查出來here

20

另一種方式來做到這一點,如果你想要的結果的列表內聯,你可以做這樣的:

Arrays.asList(new String[] { "String1", "string2" }); 
3

您可以創建一個方法地方

public static <T> T[] toArray(T... ts) { 
    return ts; 
} 

然後用它

m(toArray("blah", "hey", "yo")); 

爲更好看。

1

您現在可以直接在現代Java中編寫數組,而不需要初始化程序。你的例子現在是有效的。

String[] array = {"blah", "hey", "yo"}; 

int[] array = {1, 2, 3}; 
0

另一種選擇是使用ArrayUtils.toArray在org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2")