ChatGPT解决这个技术问题 Extra ChatGPT

有什么方法可以内联声明数组吗?

假设我有一个方法 m(),它接受一个字符串数组作为参数。有没有办法在我打电话时直接声明这个数组?即代替:

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

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

支持重构的 IDE 将允许您自动内联 strs。

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

仅供将来参考,这种类型的数组称为匿名数组(因为它没有名称)。搜索“匿名数组 java”会产生一些结果。
它类似于铸造。我想这就是我的想法,所以我不必在我需要这样做的蓝月亮中搜索它一次。
这是完全可以接受纯代码答案的罕见情况,事实上,甚至可能更可取。
@Falaina 该数组没有不同的类型(匿名),只是因为引用没有存储在直接范围的变量中。该数组仍然具有对象标识,其引用已传递并绑定到方法参数。从未听说过将对象称为匿名的。我看不到与匿名类的比较,其中有一个没有名称的新类定义。抱歉旧帖回复,寻找有关发布 Valhalla 的潜在内联数组的信息
D
Dave Jarvis

德拉蒙是对的。您还可以将 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)
@MichaelMyers (String ... strs) 是什么意思
@KasunSiyambalapitiya:单击我答案中的链接。
C
Community

您可以直接用现代 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"}),这是原始问题所要问的。
A
Antonio Carlos

另一种方法是,如果您希望将结果作为内联列表,您可以这样做:

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

你实际上不需要创建一个数组,你可以简单地做:Arrays.asList("string1", "string2", ...)
可能有用的一点:你不能用原语做到这一点。您最终会得到一个包含 type[] 的单元素 List,其中 type 是该原语。例如,Arrays.asList([some ints]) 会导致 List<int[]>
@Antonio Carlos:不,不是。您可以在返回的 List 上调用 set,它将修改数组。
在这种情况下,您应该使用 List.of(1, 2, 3)
M
Mahpooya

您可以在某处创建一个方法

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

然后使用它

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

为了更好看。


S
Shravan Ramamurthy

其他选项是在 org.apache.commons.lang3 中使用 ArrayUtils.toArray

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

它是一种替代方法,但是它有额外的函数调用添加到堆栈中,这是不必要的。
B
Bill K

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

例如,我经常创建这样的菜单:

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

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

我可以通过方法命名约定将它绑定到 menuHandler 类,方法是将我的方法命名为“menuFile,menuFileSave,menuFileLoad,...”并反射地绑定它们(还有其他选择)。

这种语法允许惊人地简短的菜单定义和极其可重用的“initMenus”方法。 (但我不费心重复使用它,因为编写起来总是很有趣,只需要几分钟+几行代码)。

任何时候你在你的代码中看到一个模式,看看你是否可以用这样的东西替换它,并且永远记住数组初始化语法是多么简洁!


这也最好作为可变参数来做。此外,任何喜欢为“有趣”而输入代码的人都应该投反对票!编码是关于解决新问题,而不是打字。哦,等等,这是 Java ;-)
你是对的,当我写这篇文章时,我并没有太多使用可变参数——而且在 java 中存在可变参数之前,我已经使用了相当多的数组初始化。我仍然更喜欢数组的一个部分是,如果将其定义为数组,则可以将其设置为文件顶部的常量而不是内联数据,还可以将其提取到配置文件中
顺便说一句,8 年后我不得不说我现在发现自己使用注释来完成几乎所有我过去使用初始化字符串数组的事情。
V
Vokail

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

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

我一直在研究一个有用的 API 来增强 Java 语言以允许内联数组和集合类型。有关更多详细信息,请访问 Google 项目 Espresso4J 或查看here


这里只有几个问题: 1. 请确保在您的帖子和个人资料中清楚地表明您隶属于 Espresso4J(请参阅我们的FAQ) 2. 请注意在相当旧的网站上发布指向您自己网站的链接帖子(尤其是像这个和 this one 这样的样板答案) - 它作为非常垃圾邮件出现并引发标志,这会削弱您的代表。
@Kev 啊抱歉。我已经澄清,我现在是 Espresso4J 项目的开发者:)