【发布时间】:2010-11-12 08:17:29
【问题描述】:
假设我有一个方法 m(),它接受一个字符串数组作为参数。有没有一种方法可以在我拨打电话时直接声明这个数组?即代替:
String[] strs = {"blah", "hey", "yo"};
m(strs);
我可以用一行替换它,避免声明一个我永远不会使用的命名变量吗?
【问题讨论】:
-
支持重构的 IDE 将允许您自动内联 strs。
假设我有一个方法 m(),它接受一个字符串数组作为参数。有没有一种方法可以在我拨打电话时直接声明这个数组?即代替:
String[] strs = {"blah", "hey", "yo"};
m(strs);
我可以用一行替换它,避免声明一个我永远不会使用的命名变量吗?
【问题讨论】:
m(new String[]{"blah", "hey", "yo"});
【讨论】:
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
【讨论】:
void m(String... strs, Integer... intgrs)。
void m(Integer i, Double d, String... str)
(String ... strs)是什么意思
另一种方法是,如果您希望将结果作为内联列表,您可以这样做:
Arrays.asList(new String[] { "String1", "string2" });
【讨论】:
Arrays.asList("string1", "string2", ...)
type[] 的单个元素List,其中type 是那个原语。例如Arrays.asList([some ints]) 产生 List<int[]>。
List 上调用set,它将修改数组。
List.of(1, 2, 3)。
您可以直接用现代 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 让数组的工作变得轻松! 对于大多数类型,只需使用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"}),这是最初的问题所要问的。
你可以在某处创建一个方法
public static <T> T[] toArray(T... ts) {
return ts;
}
那就用吧
m(toArray("blah", "hey", "yo"));
为了更好看。
【讨论】:
我想补充一点,数组初始化语法非常简洁灵活。我经常使用它从我的代码中提取数据并将其放在更有用的地方。
例如,我经常创建这样的菜单:
Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});
这将允许我编写代码来设置菜单系统。 “+”足以告诉它将该项目放在前一个项目之下。
我可以通过方法命名约定将它绑定到 menuHandler 类,方法是将我的方法命名为“menuFile、menuFileSave、menuFileLoad, ...”之类的,然后反射性地绑定它们(还有其他选择)。
这种语法允许惊人地简短的菜单定义和极其可重用的“initMenus”方法。 (但我不会费心重复使用它,因为编写起来总是很有趣,只需要几分钟+几行代码)。
任何时候你在你的代码中看到一个模式,看看你是否可以用这样的东西替换它,并且永远记住数组初始化语法是多么简洁!
【讨论】:
其他选项是在 org.apache.commons.lang3 中使用 ArrayUtils.toArray
ArrayUtils.toArray("elem1","elem2")
【讨论】:
正如 Draemon 所说,Java 最接近内联数组的是 new String[]{"blah", "hey", "yo"},但是有一个巧妙的技巧可以让您执行类似的操作
array("blah", "hey", "yo") 自动推断类型。
我一直致力于开发一个有用的 API,用于增强 Java 语言以允许内联数组和集合类型。有关更多详细信息,请访问 Google 项目 Espresso4J 或查看here