如何将ArrayList传递给varargs方法参数?


236

基本上我有一个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

最简单的方法是什么?我觉得我现在不在考虑。


Answers:


340

源文章:将列表作为参数传递给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()]));
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...

1
就内存和速度而言,此操作的成本是多少?
mindreader 2014年

如果涉及其他模板,则没有警告就无法工作。例如someMethod(someList.toArray(new ArrayList<Something>[someList.size()])),如果函数的长度超过几行,则会给您一个非常烦人的警告(因为您可以针对整个函数取消它,或者您必须在额外的步骤中创建数组并取消对您所使用的变量的警告存储。
Qw3ry

23
显然,最快的方法是给零而不是数组大小。简而言之,这是因为编译时常量支持使用优化方法。shipilev.net/blog/2016/arrays-wisdom-ancients
geg

2
@JoshM。Java需要做很多事情。;)我也(来自C#背景)错过了索引运算符。与使用Java中的HashMaps相比,在C#中使用字典更加流畅。
Per Lundberg

@PerLundberg-完全同意。也是目前主要使用Java8的C#开发人员。也许10/11会更好。:-P
Josh M.

42

在Java 8中:

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

.getMap(locations.stream().toArray(WorldLocation[]::new));

2
这是java巫毒教,但是更好的java(8)巫毒教..谢谢!
granadaCoder

locations.toArray(WorldLocations[]::new)也似乎作品由于Java 11(不含.stream()
伊兰棉兰

12

使用番石榴的可接受答案的简短版本:

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

可以通过静态导入toArray进一步缩短:

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

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

1

你可以做:

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

要么

getMap(locations.toArray(new WorldLocation[0]));

要么

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

@SuppressWarnings("unchecked") 需要删除ide警告。


1
第二个解决方案更好!
gaurav
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.