【问题标题】:Any way to declare an array in-line?有什么方法可以内联声明数组吗?
【发布时间】:2010-11-12 08:17:29
【问题描述】:

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

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

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

【问题讨论】:

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

标签: java arrays


【解决方案1】:
m(new String[]{"blah", "hey", "yo"});

【讨论】:

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

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)
  • blefoot 是对的。但你可以做void m(Integer i, Double d, String... str)
  • @MichaelMyers (String ... strs)是什么意思
  • @KasunSiyambalapitiya:点击我回答中的链接。
【解决方案3】:

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

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)
【解决方案4】:

您可以直接用现代 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"}),这是最初的问题所要问的。
【解决方案5】:

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

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

那就用吧

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

为了更好看。

【讨论】:

    【解决方案6】:

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

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

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

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

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

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

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

    【讨论】:

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

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

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

    【讨论】:

    • 它是一种替代方法,但是它有额外的函数调用添加到堆栈中,这是不必要的。
    【解决方案8】:

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

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

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

    【讨论】:

    • 这里只有几个问题: 1. 请确保在您的帖子和个人资料中清楚地表明您隶属于 Espresso4J(请参阅我们的FAQ) 2. 请小心发帖在相当旧的帖子上链接到您自己的网站(尤其是像这个和this one 这样的样板答案) - 它非常垃圾并引发了标志,这会削弱您的代表。
    • @Kev 对不起。我已经澄清,我现在是 Espresso4J 项目的开发者:)
    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2012-01-13
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多