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

MJ9*_*J93 205 java variadic-functions

基本上我有一个位置的ArrayList:

ArrayList<WorldLocation> locations = new ArrayList<WorldLocation>();
Run Code Online (Sandbox Code Playgroud)

下面我称之为以下方法:

.getMap();
Run Code Online (Sandbox Code Playgroud)

getMap()方法中的参数是:

getMap(WorldLocation... locations)
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我不确定如何将整个列表locations传入该方法.

我试过了

.getMap(locations.toArray())
Run Code Online (Sandbox Code Playgroud)

但getMap不接受,因为它不接受Objects [].

现在,如果我使用

.getMap(locations.get(0));
Run Code Online (Sandbox Code Playgroud)

它会完美地工作......但我需要以某种方式传递所有位置...我当然可以继续添加locations.get(1), locations.get(2)等等但是阵列的大小各不相同.我只是不习惯整个概念ArrayList

最简单的方法是什么?我觉得我现在不想直接思考.

aio*_*obe 300

使用该toArray(T[] arr)方法.

.getMap(locations.toArray(new WorldLocation[locations.size()]))
Run Code Online (Sandbox Code Playgroud)

(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()]));
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
Run Code Online (Sandbox Code Playgroud)

该帖子已被改写为一篇文章在这里.

  • 显然,最快的方法是给出零大小而不是数组的大小.简而言之,这是因为编译时常量允许使用优化方法.https://shipilev.net/blog/2016/arrays-wisdom-ancients/ (18认同)
  • Java需要一个扩展运算符:`.getMap(... locations)` (7认同)
  • 此操作在内存和速度方面的成本有多大? (2认同)
  • @JoshM。Java需要做很多事情。;)我也(来自C#背景)错过了索引运算符。与使用Java中的HashMaps相比,在C#中使用字典的操作更为流畅。 (2认同)

jmh*_*let 31

在Java 8中:

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

.getMap(locations.stream().toArray(WorldLocation[]::new));
Run Code Online (Sandbox Code Playgroud)

  • `locations.toArray(WorldLocations[]::new)` 似乎也从 java 11 开始工作(没有 `.stream()`) (4认同)
  • 这是java巫毒教,但是更好的java(8)巫毒教..谢谢! (2认同)

tkr*_*use 11

使用Guava接受的答案的较短版本:

.getMap(Iterables.toArray(locations, WorldLocation.class));
Run Code Online (Sandbox Code Playgroud)

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

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

    .getMap(toArray(locations, WorldLocation.class));
Run Code Online (Sandbox Code Playgroud)