有没有办法在地图中使用分配给上一个键的值,例如:
def x = [
a: someList.sum(),
b: anotherList.sum(),
c: someList.sum() / anotherList.sum()
]
我希望'c'的值为a / b,所以有一个快捷方式,这样我就不必在计算'c'时重新计算总和
答案 0 :(得分:6)
为了使用先前添加的键/值来计算新的键/值,您必须能够控制键/值的添加顺序。我知道这很明显,但可能不明显的是Groovy Map
声明没有考虑到顺序。例如,如果你写这个......
def x = [
a: 8,
b: 2,
c: a / b
]
...,在评估key c
的值的表达式时,Groovy将尝试访问名为a
的变量或属性,该变量或属性将失败,因为变量/ property不存在。但是,您可以利用该属性查找并执行此操作:
def x = [:].with {
a = 8
b = 2
c = a / b
delegate
}
首先创建一个空的Map
。然后,使用with(Closure)
对putAt()
执行get()
和Map
。上面的例子相当于......
def x = [:].with {
putAt('a', 8)
putAt('b', 2)
putAt('c', get('a') / get('b'))
delegate
}
最后,返回Map
本身,以便将其分配给x
。