Как передать ArrayList параметру метода varargs?
В основном у меня есть ArrayList мест:
ArrayList<WorldLocation> locations = new ArrayList<WorldLocation>();
ниже этого я вызываю следующий метод:
.getMap();
параметры метода getMap():
getMap(WorldLocation... locations)
Проблема, с которой я столкнулась, - это я не уверен, как передать в список WHOLE locations
этот метод.
Я пробовал
.getMap(locations.toArray())
но getMap не принимает это, потому что он не принимает объекты [].
Теперь, если я использую
.getMap(locations.get(0));
он будет работать отлично... но мне нужно как-то пройти во всех местах... Я мог бы, конечно, продолжать добавлять locations.get(1), locations.get(2)
и т.д., но размер массива меняется. Я просто не использую концепцию ArrayList
Что было бы самым простым способом? Я чувствую, что сейчас просто не думаю прямо.
Ответы
Ответ 1
Исходная статья: Передача списка в качестве аргумента методу vararg
Используйте метод 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()]));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
Ответ 2
В Java 8:
List<WorldLocation> locations = new ArrayList<>();
.getMap(locations.stream().toArray(WorldLocation[]::new));
Ответ 3
Более короткая версия принятого ответа с использованием гуавы:
.getMap(Iterables.toArray(locations, WorldLocation.class));
можно укоротить, статически импортировав в массив:
import static com.google.common.collect.toArray;
// ...
.getMap(toArray(locations, WorldLocation.class));
Ответ 4
Вы можете сделать: getMap(locations.toArray(new WorldLocation[locations.size()]));
или getMap(locations.toArray(new WorldLocation[0]));
или getMap(new
WorldLocation[locations.size()]);
@SuppressWarnings ("unchecked") необходим для удаления предупреждения ide.