4

有一个非常有用的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 语言的其他任何地方,除了java.util.Arrays?

4

4 回答 4

3

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

例子:

String[] array = ArrayUtils.toArray("1", "2");
String[] emptyArray = ArrayUtils.<String>toArray();
于 2011-11-15T09:45:33.060 回答
1

在我看来,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"));
于 2011-11-15T09:56:32.087 回答
1

来自 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;
}
于 2011-11-15T10:03:36.353 回答
1

如果你想要的东西比

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;
}
于 2011-11-15T10:19:21.670 回答