【问题标题】:Is there any varargs array construction method in Java?Java中有没有可变参数数组构造方法?
【发布时间】:2011-12-29 08:57:07
【问题描述】:

还有很实用的Arrays.asList()

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

但是没有Arrays.array()

public static <T> T[] array(T... values) {
    return values;
}

虽然这绝对是微不足道的,但这是构造数组的一种非常方便的方法:

String[] strings1 = array("1", "1", "2", "3", "5", "8");

// as opposed to the slightly more verbose
String[] strings2 = new String[] { "1", "1", "2", "3", "5", "8" };

// Of course, you can assign array literals like this
String[] strings3 = { "1", "1", "2", "3", "5", "8" };

// But you can't pass array literals to methods:
void x(String[] args);

// doesn't work
x({ "1", "1", "2", "3", "5", "8" });

// this would
x(array("1", "1", "2", "3", "5", "8"));

除了java.util.Arrays之外,Java 语言的其他地方是否有这样的方法?

【问题讨论】:

  • Lukas,您可以随时在数组中请求该方法。 :) OpenJDK 是一个开放的项目。 ;) 提交补丁,看看他们是否会接受。我相信像你的 array() 这样的方法是有用的。
  • @DejanLekic,这是个好主意

标签: java arrays verbosity


【解决方案1】:

您可以从Apache Commons 看到ArrayUtils。您必须使用 lib 3.0 或更高版本。

例子:

String[] array = ArrayUtils.toArray("1", "2");
String[] emptyArray = ArrayUtils.<String>toArray();

【讨论】:

  • +1 我在这个很好的答案中添加了一个示例。在经过同行评审之前,它是不可见的。
  • @dogbane toPrimitive 和 toObject 例如,它们做的事情不一样,但差不多 :)
  • @Fatal 啊,toArray 在 commons.lang 3 中!我会更新链接。
  • 我想这和现在一样好......是时候升级commons-lang了,很快:-)
  • @Peter Lawrey 来自 Apache 的 javadoc:“该方法通常用于调用者本身使用必须组合成数组的泛型类型的场景。”
【解决方案2】:

来自 Apache Commons Lang 的 ArrayUtils(v3.0 或更高版本):

String[] array = ArrayUtils.toArray("1", "2");
String[] emptyArray = ArrayUtils.<String>toArray();

...或者只是从 Apache 获取代码并实现“你自己”:

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

【讨论】:

    【解决方案3】:

    如果你想要短于

    x(new String[] {"1", "1", "2", "3", "5", "8"});
    

    我使用比列表本身短的以下内容。

       x("1,1,2,3,5,8".split(","));
    // {"1", "1", "2", "3", "5", "8"}
    

    它不使用任何额外的库。


    假设您想要仍然可以使用可变参数的键和值

    public static <K,V> Map<K, V> asMap(K k, V v, Object ... keysAndValues) {
        Map<K,V> map = new LinkedHashMap<K, V>();
        map.put(k, v);
        for(int i=0;i<keysAndValues.length;i+=2)
            map.put((K) keysAndValues[i], (V) keysAndValues[i+1]);
        return map;
    }
    

    【讨论】:

    • ;-) 好的,但这只是一个例子。当然,我也希望能够传递变量/常量...
    • 任意类型对象的可变长度数组。听起来不是很OO。 ;)
    • 嗯,我没有看到任何与 OO 相关的问题......它与&lt;T&gt; List&lt;T&gt; Arrays.asList(T...) 完全相同。至少对我来说......
    • 除了T 是一种特定类型,如字符串或整数。
    • 所以我会使用像public static &lt;T&gt; T[] a(T... ts) { return ts; } 这样的辅助方法,它不会更短。 (甚至使用$(1,2,3)_(1,2,3) ;)
    【解决方案4】:

    在我看来,Java 中确实不需要 array() 方法。如果您想要不那么冗长,您可以使用文字。或者在方法参数中,您可以使用可变参数(根本不需要数组)。根据您的标题,这就是您想要做的。你可以这样做:

    public static void doThings(String... values) {
        System.out.println(values[0]);
    }
    
    doThings("This", "needs", "no", "array");
    

    只有当方法签名实际上有一个数组时,你才需要指定new String[],在我看来这不是太多额外的写作。

    编辑: 看来您确实希望以更简洁的方式来调用以数组作为参数的方法。我不会只添加一行方法的外部库。例如,这将起作用:

    public static <T> T[] toArr(T... values) {
        return values;
    }
    
    yourMethod(toArr("1", "2", "3"));
    

    【讨论】:

    • 不幸的是,我有很多这种类型的方法:xx(String a, String[] b, Object[] c)。我不能改变那些......
    • 好的,那么我不知道在 Java 中有什么方法不那么冗长。顺便说一句,Java 中的varargs 通常指的是Object... 样式方法参数。也许你应该改变标题。
    • 为什么要改标题?我正在寻找具有该签名的方法 &lt;T&gt; T[] xx(T...)... 看起来像“可变参数数组构造”方法。我想使用可变参数构造数组...
    • @LukasEder 我以为您想构建可变参数或其他东西(还不清楚)。我在答案中添加了方法作为示例。
    • 是的。就像在 commons-lang 3.0 ArrayUtils... 我想,我很快就会升级我的 commons-lang。顺便说一句,我用verbosity 标记了这个问题
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多