基本上我有一个ArrayList的位置:
ArrayList locations = new ArrayList();
在此之下,我调用以下方法:
.getMap();
getMap()方法中的参数为:
getMap(WorldLocation... locations)
我遇到的问题是我不确定如何将locations的整个列表传递给该方法。
我试过了
.getMap(locations.toArray())
但是getMap不接受,因为它不接受Objects []。
现在,如果我使用
.getMap(locations.get(0));
它会完美地工作...但是我需要以某种方式传递所有位置...我当然可以继续添加locations.get(1), locations.get(2)等,但是数组的大小会有所不同。 我只是不习惯ArrayList的整个概念
最简单的方法是什么? 我觉得我现在不在考虑。
谨防Java自动将集合转换为参数数组?
源文章:将列表作为参数传递给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 strs = new ArrayList();
strs.add("hello");
strs.add("wordld");
method(strs.toArray(new String[strs.size()]));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
就内存和速度而言,此操作的成本是多少?
@mindreader我认为它的表现是:O(n)
如果涉及其他模板,则没有警告就无法工作。例如。如果函数的长度超过几行,someMethod(someList.toArray(new ArrayList[someList.size()]))会给您一个非常烦人的警告(因为您可以禁止整个函数使用它,或者您必须在额外的步骤中创建数组并禁止显示警告。您存储它的变量。
显然,最快的方法是给零而不是数组大小。简而言之,这是因为编译时常数允许使用优化方法。 shipilev.net/blog/2016/arrays-wisdom-ancients
Java需要传播运算符:.getMap(...locations)
@JoshM。 Java需要做很多事情。 ;)我也(来自C#背景)错过了索引运算符。与使用Java中的HashMaps相比,在C#中使用字典的操作更为流畅。
@PerLundberg-完全同意。也是目前主要使用Java8的C#开发人员。也许10/11会更好。 :-P
Java 10+在局部变量推断方面略胜一筹,但诸如值类型之类的重大更改仍处于该语言的规划阶段。我真的希望有一天也能获得非擦除的泛型... :)(目前也在Java 8中,但正在向Java 11迈进)
gaaaaaaaaaaaaaaaaaaaaaaaaaaaa更多java伏都教。感谢您的回答!
在Java 8中:
List locations = new ArrayList<>();
.getMap(locations.stream().toArray(WorldLocation[]::new));
这是java巫毒教,但是更好的java(8)巫毒教..谢谢!
使用番石榴的可接受答案的简短版本:
.getMap(Iterables.toArray(locations, WorldLocation.class));
可以通过静态导入toArray进一步缩短:
import static com.google.common.collect.toArray;
// ...
.getMap(toArray(locations, WorldLocation.class));
您可以执行:getMap(locations.toArray(new WorldLocation[locations.size()]));或getMap(locations.toArray(new WorldLocation[0]));或getMap(new
WorldLocation[locations.size()]);
需要@SuppressWarnings(" unchecked")来删除ide警告。