Groovy-Join过滤器映射

Groovy-Join过滤器映射,groovy,Groovy,我想看看谁能想出实现这一目标的最佳GroovySh方法- def m1 = [["id":"1","o":"11"],["id":"1","o":"12"],["id":"2","o":"21"]] def m2 = [["o":"11","t":"t1"],["o":"11","t":"t2"],["o":"21","t":"t1"]] 我想要结果 [["id":"1","t":"t1"],["id":"1","t":"t2"],["id":"2","t":"t1"]] 我目前正在迭代地图

我想看看谁能想出实现这一目标的最佳GroovySh方法-

def m1 = [["id":"1","o":"11"],["id":"1","o":"12"],["id":"2","o":"21"]]
def m2 = [["o":"11","t":"t1"],["o":"11","t":"t2"],["o":"21","t":"t1"]]
我想要结果

[["id":"1","t":"t1"],["id":"1","t":"t2"],["id":"2","t":"t1"]]
我目前正在迭代地图并进行此操作。我正在寻找使用Gpath和findAll的解决方案

谢谢,
Sreehari。

您可以使用转置将地图压缩成对,然后组合这些对并按地图键过滤:

[m1, m2]
    .transpose()
    .collect { (it[0] + it[1]).subMap(['id', 't']) }
评估结果是

[[id:1, t:t1], [id:1, t:t2], [id:2, t:t1]]

这可以在groovysh中使用groovy-2.4.4和jdk7或jdk8进行工作。

您可以
转置两个列表并从每个列表中获取条目(
id
t
):

def fn = { m1, m2 ->
    return [m1,m2]
        .transpose()
        .collect { [ id: it.first().id, t: it.last().t ] }
}


def m1 = [["id":"1","o":"11"],["id":"1","o":"12"],["id":"2","o":"21"]]
def m2 = [["o":"11","t":"t1"],["o":"11","t":"t2"],["o":"21","t":"t1"]]


assert fn(m1, m2) == 
        [["id":"1","t":"t1"],["id":"1","t":"t2"],["id":"2","t":"t1"]]

@sreehari:它按键过滤地图:我不能接受这个答案,因为它不会编译并产生上述所需的结果。@sreehari:您完全有权选择适合您的答案,但您上面的评论似乎不准确。也许您需要指定如何更清楚地执行此操作。