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

时间:2016-04-06 20:51:18

标签: dictionary groovy

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

def x = [
        a: someList.sum(),
        b: anotherList.sum(),
        c: someList.sum() / anotherList.sum()
]

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

1 个答案:

答案 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