Collections 是否可以在Groovy中为自定义类实现集合文字初始值设定项?
例如,LibGDX框架具有定制的集合类,如Collections 是否可以在Groovy中为自定义类实现集合文字初始值设定项?,collections,groovy,literals,Collections,Groovy,Literals,例如,LibGDX框架具有定制的集合类,如Array和ObjectMap,它们有助于提高应用程序/游戏的性能。是否可以创建一个文本初始值设定项,以便可以使用例如[1,2,3,4]和ObjectMap使用[key:“value”]初始化数组 我知道可以通过实现putAt/getAt方法将访问操作符[]添加到对象中,但还没有看到关于文本初始值设定项的任何内容 它们是像Java中的运算符重写一样被锁定在语言本身中,还是有办法为自定义类创建列表/映射初始值设定项?一种可能的方法是操纵现有的LinkedH
Array
和ObjectMap
,它们有助于提高应用程序/游戏的性能。是否可以创建一个文本初始值设定项,以便可以使用例如[1,2,3,4]
和ObjectMap
使用[key:“value”]
初始化数组
我知道可以通过实现putAt
/getAt
方法将访问操作符[]
添加到对象中,但还没有看到关于文本初始值设定项的任何内容
它们是像Java中的运算符重写一样被锁定在语言本身中,还是有办法为自定义类创建列表/映射初始值设定项?一种可能的方法是操纵现有的LinkedHashMap.asType()
方法以接受ObjectMap
作为参数:
def originalMethod = LinkedHashMap.getMetaClass().getMetaMethod("asType", Class)
LinkedHashMap.getMetaClass().asType = { Class clazz ->
if(clazz == ObjectMap) {
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
else {
originalMethod.invoke(delegate, clazz)
}
}
然后,您可以执行以下操作:
def map = [a:1] as ObjectMap
另一个选项是向基本Map
元类添加方法toObjectMap()
,如下所示:
Map.getMetaClass().toObjectMap = { ->
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
然后,您可以执行以下操作:
def map2 = [a:2].toObjectMap()
或者,只需编写一个实用方法将映射转换为ObjectMaps;-) 一种可能的方法是操作现有的LinkedHashMap.asType()
方法以接受ObjectMap
作为参数:
def originalMethod = LinkedHashMap.getMetaClass().getMetaMethod("asType", Class)
LinkedHashMap.getMetaClass().asType = { Class clazz ->
if(clazz == ObjectMap) {
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
else {
originalMethod.invoke(delegate, clazz)
}
}
然后,您可以执行以下操作:
def map = [a:1] as ObjectMap
另一个选项是向基本Map
元类添加方法toObjectMap()
,如下所示:
Map.getMetaClass().toObjectMap = { ->
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
然后,您可以执行以下操作:
def map2 = [a:2].toObjectMap()
或者,只需编写一个实用方法将映射转换为ObjectMaps;-) 一种可能的方法是操作现有的LinkedHashMap.asType()
方法以接受ObjectMap
作为参数:
def originalMethod = LinkedHashMap.getMetaClass().getMetaMethod("asType", Class)
LinkedHashMap.getMetaClass().asType = { Class clazz ->
if(clazz == ObjectMap) {
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
else {
originalMethod.invoke(delegate, clazz)
}
}
然后,您可以执行以下操作:
def map = [a:1] as ObjectMap
另一个选项是向基本Map
元类添加方法toObjectMap()
,如下所示:
Map.getMetaClass().toObjectMap = { ->
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
然后,您可以执行以下操作:
def map2 = [a:2].toObjectMap()
或者,只需编写一个实用方法将映射转换为ObjectMaps;-) 一种可能的方法是操作现有的LinkedHashMap.asType()
方法以接受ObjectMap
作为参数:
def originalMethod = LinkedHashMap.getMetaClass().getMetaMethod("asType", Class)
LinkedHashMap.getMetaClass().asType = { Class clazz ->
if(clazz == ObjectMap) {
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
else {
originalMethod.invoke(delegate, clazz)
}
}
然后,您可以执行以下操作:
def map = [a:1] as ObjectMap
另一个选项是向基本Map
元类添加方法toObjectMap()
,如下所示:
Map.getMetaClass().toObjectMap = { ->
def map = new ObjectMap()
delegate.each { key, value -> map.put(key, value) }
map
}
然后,您可以执行以下操作:
def map2 = [a:2].toObjectMap()
或者,只需编写一个实用方法将映射转换为ObjectMaps;-) 你能举个例子说明你的意思吗?我想OP想从[x:42]
之类的东西中获取ObjectMap,而不是LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用和
消除一些重复。作为ObjectMap的[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于ObjectMap
是如何实现的。。。当我有机会的时候我会看一看你能举个例子说明你的意思吗?我想OP想从[x:42]
之类的东西而不是LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用和
消除一些重复。作为ObjectMap的[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于ObjectMap
是如何实现的。。。当我有机会的时候我会看一看你能举个例子说明你的意思吗?我想OP想从[x:42]
之类的东西而不是LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用和
消除一些重复。作为ObjectMap的[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于ObjectMap
是如何实现的。。。当我有机会的时候我会看一看你能举个例子说明你的意思吗?我想OP想从[x:42]
之类的东西而不是LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用和
消除一些重复。作为ObjectMap的[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于ObjectMap
是如何实现的。。。等我有机会再看一看。尽管这样做的缺点是总有两次分配。一个用于临时LinkedHashMap(很快就会离开作用域并标记为GC),另一个用于ObjectMap。我想这是我必须接受的(我并不是每次都使用文字贴图)。谢谢你的回答。易用性总是要付出代价的;-)以延伸蒂姆的回答。如果该类提供了一个构造函数,其中列表的每个元素都适合该构造函数(例如使用Object[]/Object…),则类似于ObjectMap map2=[1,2,3]
的行将起作用。这仍然会创建一个中间LinkedHashMap,但Groovy的未来版本可能会在此基础上进行优化。尽管这样做的缺点是总有两次分配。一个用于临时LinkedHashMap(很快就会离开作用域并标记为GC),另一个用于ObjectMap。我想这是我必须接受的(我并不是每次都使用文字贴图)。谢谢你的回答。易用性总是要付出代价的;-)以延伸蒂姆的回答。如果该类提供了一个构造函数,其中列表的每个元素都适合该构造函数(例如使用Object[]/Object…),则类似于ObjectMap map2=[1,2,3]
的行将起作用。这仍然会创建一个中间LinkedHashMap,但Groovy的未来版本可能会在此基础上进行优化。尽管这样做的缺点是总有两次分配。一个用于临时LinkedHashMap(很快就会离开作用域并标记为GC),另一个用于ObjectMap。我想这是我必须接受的(我并不是每次都使用文字贴图)。谢谢你的回答。易用性总是要付出代价的;-)以延伸蒂姆的回答。如果类提供构造函数