假设我有一个方法m(),它接受一个字符串数组作为参数。是否有一种方法可以在调用时内联声明这个数组?例如:
String[] strs = {"blah", "hey", "yo"};
m(strs);
我可以用一行替换它,避免声明一个我永远不会使用的命名变量吗?
假设我有一个方法m(),它接受一个字符串数组作为参数。是否有一种方法可以在调用时内联声明这个数组?例如:
String[] strs = {"blah", "hey", "yo"};
m(strs);
我可以用一行替换它,避免声明一个我永远不会使用的命名变量吗?
德雷蒙是对的。你也可以声明m为可变参数:
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
我想补充的是,数组初始化语法非常简洁和灵活。我经常使用它从我的代码中提取数据,并将其放在更有用的地方。
举个例子,我经常创建这样的菜单:
Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});
这将允许我写来的代码来设置一个菜单系统。“+”足以告诉它将该项放在前一项之下。
我可以通过方法命名约定将它绑定到menuHandler类,比如将我的方法命名为“menuFile, menuFileSave, menuFileLoad,…”,并反射地绑定它们(还有其他替代方法)。
这种语法允许非常简单的菜单定义和极其可重用的“initMenus”方法。(但是我不想重复使用它,因为写它总是很有趣,而且只需要几分钟+几行代码)。
任何时候在代码中看到一个模式,看看是否可以用类似这样的东西替换它,并始终记住数组初始化语法是多么简洁!
正如dramon所说,Java最接近内联数组的是new String[]{"blah", "hey", "yo"},但是有一个巧妙的技巧可以让您做一些像这样的事情
数组("blah", "hey", "yo"),类型自动推断。
我一直在研究一个有用的API,用于扩展Java语言,以支持内联数组和集合类型。欲了解更多详细信息谷歌项目Espresso4J或查看这里
另一种方法是,如果你想将结果作为List内联,你可以这样做:
Arrays.asList(new String[] { "String1", "string2" });
您可以在某处创建方法
public static <T> T[] toArray(T... ts) {
return ts;
}
然后使用它
m(toArray("blah", "hey", "yo"));
为了更好看。
您可以直接在现代Java中编写数组,而不需要初始化式。你的例子现在是有效的。无论如何,通常最好为参数命名。
String[] array = {"blah", "hey", "yo"};
or
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()
...
另一个选择是使用ArrayUtils。org.apache.commons.lang3中的toArray
ArrayUtils.toArray("elem1","elem2")