Groovy:以递归方式轻松地创建对象



我需要创建一个对象,而无需事先描述其结构。对象由参数组成,这些参数本身可以是对象(如json对象(。

然后我希望能够使用以下语法创建一个对象:

def a = <TBD>
a.b.c = 'd'

这将导致a = [b:[c:d]]

我认为实现这一点的一种方法是使用默认值,但我必须提前了解对象的深度。

def a = [:].withDefault { [:].withDefault { [:] } }
a.b.c = 'd'
// results in a = [b:[c:d]]

还有别的办法吗?

def M(){ [:].withDefault{ M() } }
def a=M()
a.b.c.d.e.f.g.h = '123'
println a

打印

[b:[c:[d:[e:[f:[g:[h:123]]]]]]]

提供更多控制的更复杂的方法:

class Endless {
Map<String,Endless> m = [:]
def propertyMissing(String name, value) {
m[name] = value
}

def propertyMissing(String name) {
if( !m.containsKey( name ) ) m[ name ] = new Endless()
m[name] 
}

String toString(){ m }
}
Endless a = new Endless()
a.b.c.d.e = 42
assert a.toString() == '{b={c={d={e=42}}}}'
assert a.b.c.toString() == '{d={e=42}}'

最新更新