Groovy -连接过滤器映射



我想看看谁能想出最好的Groovy-sh方法来实现这一点-

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"]]

I want result

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

我目前迭代的地图和这样做。我正在寻找使用Gpath和findAll的解决方案

谢谢,Sreehari .

您可以transpose两个列表并从每个列表中获取条目(idt):

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"]]

您可以使用转置将映射压缩成成对,然后组合成对并按映射键进行过滤:

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

求值为

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

最新更新