ChatGPT解决这个技术问题 Extra ChatGPT

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

基本上我有一个位置的 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 的整个概念

解决这个问题的最简单方法是什么?我觉得我现在只是没有直接思考。


a
aioobe

来源文章:Passing a list as an argument to a vararg method

使用 toArray(T[] arr) 方法。

.getMap(locations.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("world");
    
    method(strs.toArray(new String[0]));
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
...

就内存和速度而言,此操作的成本是多少?
如果涉及更多模板,这将不会在没有警告的情况下起作用。例如,如果函数超过几行,someMethod(someList.toArray(new ArrayList<Something>[someList.size()])) 会给你一个非常烦人的警告(因为你可以为整个函数取消它,或者你必须在一个额外的步骤中创建数组并取消警告您存储它的变量。
显然,最快的方法是给出零大小而不是数组的大小。简而言之,这是因为编译时常量允许使用优化的方法。 shipilev.net/blog/2016/arrays-wisdom-ancients
@JoshM。 Java需要很多东西。 ;) 我也(来自 C# 背景)想念索引运算符。在 C# 中使用字典比在 Java 中使用 HashMap 更顺畅。
@PerLundberg——完全同意。也是目前使用 Java8 工作的主要 C# 开发人员。也许10/11会更好。 :-P
j
jmhostalet

在 Java 8 中:

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

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

这是 java voodoo,但更好的 java (8) voodoo .. 谢谢!
自 java 11 起,locations.toArray(WorldLocations[]::new) 似乎也有效(没有 .stream()
@EranMedan toArray 总是在没有流的情况下工作,无论版本如何,请参阅:docs.oracle.com/javase/1.5.0/docs/api/java/util/List.html
@kaba713 是的,但不是接受 IntFunction 的重载,它是在 Java 11 中添加的 :) docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/…
t
tkruse

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

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

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

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

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

这个答案对我有用,因为我想要一个 List 数组,但无法实例化通用数组以使用 Array.toArray
* List.toArray
S
Sylhare

你可以做:

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

或者

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

或者

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

@SuppressWarnings("unchecked") 是删除 ide 警告所必需的。


第二种解决方案更好!
第三种解决方案给出了一个空白数组,不要使用它。
N
Nikhilesh Patve

虽然在这里标记为已解决,但我的 KOTLIN RESOLUTION

fun log(properties: Map<String, Any>) {
    val propertyPairsList = properties.map { Pair(it.key, it.value) }
    val bundle = bundleOf(*propertyPairsList.toTypedArray())
}

bundleOf 具有可变参数


这对 kotlin 来说是一个很好的答案,但它不太可能帮助很多人,因为该问题被标记为 java