在 Groovy 中动态地将元素添加到 ArrayList

Posted

技术标签:

【中文标题】在 Groovy 中动态地将元素添加到 ArrayList【英文标题】:Dynamically adding elements to ArrayList in Groovy 【发布时间】:2014-08-03 01:28:12 【问题描述】:

我是 Groovy 的新手,尽管阅读了很多关于此的文章和问题,但我仍然不清楚发生了什么。 据我目前了解,当您在 Groovy 中创建一个新数组时,底层类型是 Java ArrayList。这意味着它应该是可调整大小的,您应该能够将其初始化为空,然后通过 add 方法动态添加元素,如下所示:

MyType[] list = []
list.add(new MyType(...))

这可以编译,但是在运行时失败:没有方法签名:[LMyType;.add() 适用于参数类型:(MyType) 值:[MyType@383bfa16]

执行此操作的正确方法或正确类型是什么?

【问题讨论】:

【参考方案1】:

执行此操作的 Groovy 方法是

def list = []
list << new MyType(...)

它创建一个列表并使用重载的leftShift 运算符来附加一个项目

有关大量示例,请参阅 Groovy docs on Lists。

【讨论】:

好吧,这行得通。如果您像这样定义列表,实际上 list.add(new MyType(...)) 也可以工作。但我有一个评论和一个问题。评论:所以当你创建它时,没有办法指定你将在列表中放入什么类型?问题:为什么它会以这种方式工作,而如果我指定了一个类型,它就不会?在这种情况下,它看起来好像使用的是不同的底层类型,然后是 ArrayList。 你可以使用List&lt;MyList&gt; list = [],但是如果你不使用CompileStatic,它基本上会被忽略 你也可以def list = [new MyType(...)]【参考方案2】:

您实际创建的内容:

MyType[] list = []

是大小为 0 的固定大小数组(不是列表)。您可以创建大小为 4 的固定大小数组:

MyType[] array = new MyType[4]

但是当然没有 add 方法。

如果您使用def 创建列表,则类似于使用Object 创建此实例(您可以阅读有关def here 的更多信息)。而[] 在这种情况下会创建空的ArrayList

因此,使用def list = [],您可以使用ArrayListadd() 方法追加新项目

list.add(new MyType())

或者更常规的重载左移运算符的方式:

list << new MyType() 

【讨论】:

谢谢。那么有没有办法创建一个特定类型的动态列表呢? tim_yates 在对第二个答案的评论中已经回答了这个问题 :)

以上是关于在 Groovy 中动态地将元素添加到 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

如何在angularjs中动态地将样式属性添加到具有ng-class的元素

如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?

在 WPF 中动态地将元素定位到网格中

如何将 DOM 元素附加到动态新添加的 DOM 元素

正确地将 Groovy 列表传递给 GSP 中的 Javascript 代码

在Angular中动态地将控件添加到FormGroup