Как передать ArrayList в параметр метода varargs? - PullRequest
185 голосов
/ 26 марта 2012

В основном у меня есть ArrayList мест:

ArrayList<WorldLocation> locations = new ArrayList<WorldLocation>();

ниже этого я вызываю следующий метод:

.getMap();

параметры в методе getMap ():

getMap(WorldLocation... locations)

Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как передать ВЕСЬ список locations в этот метод.

Я пробовал

.getMap(locations.toArray())

но getMap не принимает это, потому что не принимает Objects [].

Теперь, если я использую

.getMap(locations.get(0));

это будет отлично работать ... но мне нужно как-то передать ВСЕ места ... Я, конечно, мог бы продолжать добавлять locations.get(1), locations.get(2) и т. Д., Но размер массива меняется. Я просто не использую всю концепцию ArrayList

Какой самый простой способ это сделать? Я чувствую, что сейчас просто не соображаю.

Ответы [ 4 ]

276 голосов
/ 26 марта 2012

Используйте метод toArray(T[] arr).

.getMap(locations.toArray(new WorldLocation[locations.size()]))

(toArray(new WorldLocation[0]) также работает, но вы бы выделяли массив нулевой длины без причины.)


Вот полный пример:

public static void method(String... strs) {
    for (String s : strs)
        System.out.println(s);
}

...
    List<String> strs = new ArrayList<String>();
    strs.add("hello");
    strs.add("wordld");

    method(strs.toArray(new String[strs.size()]));
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...

Этот пост был переписан как статья здесь .

25 голосов
/ 23 марта 2018

В Java 8:

List<WorldLocation> locations = new ArrayList<>();

.getMap(locations.stream().toArray(WorldLocation[]::new));
7 голосов
/ 21 января 2018

Более короткая версия принятого ответа с использованием Guava:

.getMap(Iterables.toArray(locations, WorldLocation.class));

может быть дополнительно сокращена путем статического импорта в массив:

import static com.google.common.collect.toArray;
// ...

    .getMap(toArray(locations, WorldLocation.class));
0 голосов
/ 04 сентября 2018

Вы можете сделать: getMap(locations.toArray(new WorldLocation[locations.size()])); или getMap(locations.toArray(new WorldLocation[0])); или getMap(new WorldLocation[locations.size()]);

@ SuppressWarnings ("unchecked") необходимо для удаления предупреждения ide.

...