有什么方法可以在线声明数组吗?


616

假设我有一个方法m(),该方法将字符串数组作为参数。有什么方法可以在我打电话时直接声明该数组?即代替:

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

我可以只用一行替换它,而避免声明一个我永远不会使用的命名变量吗?


2
支持重构的IDE将允许您自动内联str。
Paul McKenzie,2009年

Answers:


944
m(new String[]{"blah", "hey", "yo"});

77
仅供以后参考,这种类型的数组称为匿名数组(因为它没有名称)。搜索“匿名数组java”将产生一些结果。
Falaina

2
它类似于铸造。我认为这就是我要考虑的方式,因此不必在一次蓝月亮中用Google搜索一次,我需要这样做。
ArtOfWarfare 2012年

这是一种罕见的情况,其中仅接受代码的答案是完全可以接受的,甚至可能是更可取的。
马克斯·冯·希佩尔

113

Draemon是正确的。您也可以声明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

19
非常漂亮的语法,但是使用此方法,您只能有一个数组参数,并且它必须是最后一个。因此,您不能这样做:void m(String... strs, Integer... intgrs)例如。
bluefoot'3

5
blefoot是正确的。但是您可以void m(Integer i, Double d, String... str)
Igor S.

@MichaelMyers是什么意思(String ... strs)
Kasun Siyambalapitiya

1
@KasunSiyambalapitiya:单击我的答案中的链接。
迈克尔·迈尔斯

30

另一种方法是,如果希望将结果作为内联的List,则可以这样进行:

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

38
您实际上不需要创建数组,只需执行以下操作即可:Arrays.asList("string1", "string2", ...)
Elias Dorneles 2013年

2
可能有用的一点:您无法使用基元执行此操作。您将最终获得该原始元素Listtype[]何处的单个元素type。例如Arrays.asList([some ints])导致一个List<int[]>
Moira

@安东尼奥·卡洛斯:不,不是。您可以调用set返回的值List,它将修改数组。
Holger

17

您可以直接使用现代Java编写数组,而无需初始化。您的示例现在有效。无论如何,通常最好还是命名该参数。

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

要么

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

如果必须内联,则需要声明类型:

functionCall(new String[]{"blah", "hey", "yo"});

或使用varargs(可变参数)

void functionCall(String...stringArray) {
    // Becomes a String[] containing any number of items or empty
}

functionCall("blah", "hey", "yo");

希望Java的开发人员将允许在 未来

更新:Kotlin答案

Kotlin使处理数组变得非常容易!对于大多数类型,只需使用arrayOf,它将隐式确定类型。什么也不让他们空着。

arrayOf("1", "2", "3") // String
arrayOf(1, 2, 3)       // Int
arrayOf(1, 2, "foo")   // Any 
arrayOf<Int>(1, 2, 3)  // Set explict type
arrayOf<String>()      // Empty String array

基元具有实用功能。什么也不让他们空着。

intArrayOf(1, 2, 3)
charArrayOf()
booleanArrayOf()
longArrayOf()
shortArrayOf()
byteArrayOf()

如果您已经有一个Collection并希望将其转换为内联数组,则只需使用:

collection.toTypedArray()

如果需要强制使用数组类型,请使用:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...

但是您不能做doSomething({"blah", "hey", "yo"}),这是原始问题要问的问题。
David DeMar

11

您可以在某处创建方法

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

然后用它

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

以获得更好的外观。


3

我想补充一点,数组初始化语法非常简洁和灵活。我用它来从我的代码中提取数据并将其放在更有用的地方。

例如,我经常创建如下菜单:

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

这将允许我编写代码来设置菜单系统。“ +”足以告诉它将该项放置在上一项之下。

我可以通过方法命名约定将其绑定到menuHandler类,方法是将我的方法命名为“ menuFile,menuFileSave,menuFileFileLoad ...”,然后进行反射性绑定(还有其他选择)。

这种语法使AMAZINGLY的菜单定义非常简短,并且可以极大地重用“ initMenus”方法。(但是,我不会再使用它,因为编写它总是很有趣,并且只需要几分钟和几行代码)。

每当您在代码中看到模式时,请查看是否可以将其替换为类似的格式,并始终记住数组初始化语法的简洁程度!


5
这也最好作为varargs使用。此外,任何喜欢为“有趣”输入代码的人都应该受到谴责!编码是要解决新问题,而不是打字。哦,等等,这是Java ;-)
mjaggard

1
没错,当我写这篇文章时,我并没有太多使用varargs,而且在Java中存在varargs之前,我使用了很多数组初始化功能。我仍然更喜欢数组的一部分是,如果将其定义为aray,则可以使它在文件顶部而不是内联数据处成为常量,也可以将其提取到配置文件中
比尔ķ

顺便说一句,八年后,我不得不说,我现在发现自己在使用注释来完成几乎所有使用初始化字符串数组的工作。
比尔K


1

正如Draemon所说,Java最接近内联数组的地方是new String[]{"blah", "hey", "yo"}有一个巧妙的技巧,可以让您做类似的事情

array("blah", "hey", "yo") 自动推断的类型。

我一直在研究一种有用的API,用于扩展Java语言以允许内联数组和集合类型。有关更多详细信息,请使用google project Espresso4J或在此处查看


9
这里有几个问题:1.请确保在您的帖子和个人资料中清楚地表明您与Espresso4J有关联(请参阅我们的FAQ)2.请注意在相当老的帖子上张贴指向您自己网站的链接(尤其是样板答案,例如这样的问题和问题的答案)-它非常垃圾,并且会升起标记,从而使您的代表受挫。
Kev

@Kev啊,抱歉。我已经澄清说,我现在是Espresso4J优秀项目的开发者:)
Jonathan Weatherhead
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.