Есть ли какой-либо метод построения массива varargs в Java? - PullRequest
4 голосов
/ 15 ноября 2011

Есть очень полезный 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 ]

3 голосов
/ 15 ноября 2011

Вы могли видеть ArrayUtils из Apache Commons . Вы должны использовать lib версии 3.0 или выше.

Примеры:

String[] array = ArrayUtils.toArray("1", "2");
String[] emptyArray = ArrayUtils.<String>toArray();
1 голос
/ 15 ноября 2011

Если вы хотите что-то короче

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

Я использую следующее, которое короче самого списка.

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

Не использует никакой дополнительной библиотеки.


Скажем, вам нужны ключи и значения, которые вы все еще можете использовать varargs

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;
}
1 голос
/ 15 ноября 2011

ArrayUtils от Apache Commons Lang (v3.0 или выше):

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

... или просто возьмите код из Apache и реализуйте «себя»:

public static <T> T[] toArray(final T... items) {
    return items;
}
1 голос
/ 15 ноября 2011

По-моему, в Java нет необходимости в методе array(). Если вы хотите меньше слов, как вы сказали, вы можете использовать литералы. Или в параметрах метода вы можете использовать varargs (нет необходимости в массиве вообще). Исходя из вашего названия, это то, что вы хотите сделать. Вы можете просто сделать это:

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"));
...