Groovy地图创建,使用分配给上一个键的值

Ana*_*man 4 groovy dictionary

有没有办法在地图中使用分配给上一个键的值,例如:

def x = [
        a: someList.sum(),
        b: anotherList.sum(),
        c: someList.sum() / anotherList.sum()
]
Run Code Online (Sandbox Code Playgroud)

我希望'c'的值为a/b,所以有一个快捷方式,这样我就不必在计算'c'时重新计算总和

Emm*_*osa 6

为了使用先前添加的键/值来计算新的键/值,您必须能够控制键/值的添加顺序.我知道这很明显,但可能并不明显的是Groovy Map声明没有考虑到顺序.例如,如果你写这个......

def x = [
        a: 8,
        b: 2,
        c: a / b
]
Run Code Online (Sandbox Code Playgroud)

...,在计算key值的表达式时c,Groovy将尝试访问一个名为的变量或属性a,该变量或属性将失败,因为变量/ property不存在.但是,您可以利用该属性查找并执行以下操作:

def x = [:].with {
    a = 8
    b = 2
    c = a / b

    delegate
}
Run Code Online (Sandbox Code Playgroud)

首先创建一个空的Map.然后,with(Closure)用来执行putAt()get()反对Map.上面的例子相当于......

def x = [:].with {
    putAt('a', 8)
    putAt('b', 2)
    putAt('c', get('a') / get('b'))

    delegate
}
Run Code Online (Sandbox Code Playgroud)

最后,返回Map自己以便分配给它x.