【问题标题】:Passing a List in as varargs [duplicate]将列表作为可变参数传递[重复]
【发布时间】:2012-08-26 13:34:20
【问题描述】:

我有一个List<Thing>,我想将它传递给声明为doIt(final Thing... things) 的方法。有没有办法做到这一点?

代码看起来像这样

public doIt(final Thing... things)
{
    // things get done here
}

List<Thing> things = /* initialized with all my things */;

doIt(things);

该代码显然不起作用,因为 doIt() 采用 Thing 而不是 List&lt;Thing&gt;

有没有办法将列表作为可变参数传递?

这是在 Android 应用程序中,但我不明白为什么该解决方案不适用于任何 Java

【问题讨论】:

    标签: java android list variadic-functions


    【解决方案1】:

    只需传递things.toArray(new Thing[things.size()])

    【讨论】:

    • 应该是things.toArray(new Thing[things.size()]);
    • 就可以了。 (是的,@Gray 是对的,传入适当大小的数组会更有效率。)
    • 两者都可以@newacct,但我的建议不会创建必须立即进行 GC 处理的数组对象。
    • 从 Java 6 及更高版本开始,执行things.toArray(new Thing[0]) 通常性能更高。
    • @SLaks 来自 Intellij 重构建议“由于 OpenJDK 6 的后期更新,这个调用是内在的,与预调整大小的版本相比,空数组版本的性能相同,有时甚至更好。此外,传递预先确定大小的数组对于并发或同步集合也是危险的,因为在 size 和 toArray 调用之间可能会出现数据竞争,如果集合在操作期间同时收缩,这可能会导致数组末尾出现额外的空值。”此外,还有一个基准表明它更快:stackoverflow.com/a/29444594/765419
    【解决方案2】:

    可变参数在内部被解释为一个数组。因此,您应该事先将其转换为数组。同样在您的 doIt 方法中,您应该使用数组索引访问 things-s 元素。

    【讨论】:

    • 感谢您的快速回复。这很好用。您提到通过数组索引访问元素是有原因的,还是您可以这样做?没有理由不在 doIt() 中 for(Thing t : things),对吧?
    • 我无法将您的答案和 SLaks 的答案都标记为正确,因此我认为您应该编辑他的答案,并添加有效的原因。然后我会做出正确的答案。抱歉,人们喜欢在答案中看到代码。
    • @xbakesx 你没有理由不能使用 for-each。
    • 当然,增强的 for 循环将适用于数组。我只是强调了集合接口的方法在可变参数中不起作用,因为它是一个数组。
    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2012-02-21
    • 1970-01-01
    • 2014-02-27
    • 2018-08-30
    相关资源
    最近更新 更多