在 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<MyList> list = []
,但是如果你不使用CompileStatic
,它基本上会被忽略
你也可以def list = [new MyType(...)]
【参考方案2】:
您实际创建的内容:
MyType[] list = []
是大小为 0 的固定大小数组(不是列表)。您可以创建大小为 4 的固定大小数组:
MyType[] array = new MyType[4]
但是当然没有 add 方法。
如果您使用def
创建列表,则类似于使用Object
创建此实例(您可以阅读有关def
here 的更多信息)。而[]
在这种情况下会创建空的ArrayList
。
因此,使用def list = []
,您可以使用ArrayList
的add()
方法追加新项目
list.add(new MyType())
或者更常规的重载左移运算符的方式:
list << new MyType()
【讨论】:
谢谢。那么有没有办法创建一个特定类型的动态列表呢? tim_yates 在对第二个答案的评论中已经回答了这个问题 :)以上是关于在 Groovy 中动态地将元素添加到 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章
如何在angularjs中动态地将样式属性添加到具有ng-class的元素
如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?