将列表作为可变参数传递[重复]

Posted

技术标签:

【中文标题】将列表作为可变参数传递[重复]【英文标题】: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

【问题讨论】:

【参考方案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 调用之间可能会出现数据竞争,如果集合在操作期间同时收缩,这可能会导致数组末尾出现额外的空值。”此外,还有一个基准表明它更快:***.com/a/29444594/765419【参考方案2】:

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

【讨论】:

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

以上是关于将列表作为可变参数传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将可变参数列表传递给 syslog

如何将构造函数(可变参数)作为模板参数传递?

函数的参数传递(转)

无法将“NSLayoutConstraint”类型的不可变值作为 inout 参数传递

如何在 Maxima 中将列表作为变量参数函数传递?

markdown python可变参数传递参数列表