Groovy地图创建,使用分配给先前键的值

4

有没有一种方法可以使用map中前一个键分配的值,例如:

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

我希望 'c' 的值为 a/b,是否有一种快捷方式,而不需要在计算 'c' 时重新计算总和。

定义 a = 1;定义 x = [a: a, b: a + 1] - JB Nizet
那很明显,但不是我要找的。 - Anand Sunderraman
1
你能解释一下为什么你想要这个吗?除了理论上的原因,我想不出其他的理由。 - tim_yates
我赞同Tim的观点。可以使用def x = [a: 1]; x.b = x.a + 1 - dmahapatro
这两个解决方法仍然可以应用。我不是Groovy专家,但我怀疑你想要的以你想要的方式实现可能是不可能的。 - JB Nizet
显示剩余2条评论
1个回答

6
为了使用先前添加的键/值来计算新的键/值,您必须能够控制添加键/值的顺序。我知道这很明显,但可能不是很明显的是,Groovy Map声明不考虑顺序。例如,如果您编写以下内容...
def x = [
        a: 8,
        b: 2,
        c: a / b
]

当计算键 c 的值时,Groovy会尝试访问名为 a 的变量或属性,但由于变量/属性不存在而失败。但是,您可以利用该属性查找并执行以下操作:

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

如果您想使用这样的方法,我认为可以通过类似于https://gist.github.com/jeffbrown/4182689de487968b9f7f57e8f3ba08aa的东西来简化。 - Jeff Scott Brown
1
你可以返回 it 而不是 delegate - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接