根据值的集合删除映射项-如何以Groovy的方式进行?

时间:2019-03-15 19:00:36

标签: groovy collections

是否有一种Groovy方式从a中删除与b中的值匹配的元素?

def a = [1:"aa", 2:"bb", 3:"cc", 4:"dd"]
def b = [ "bb", "dd"]

expected output : [1:"aa", 3:"cc"]

我目前正在使用2个嵌套的for循环来解决此问题。我想知道Groovy是否有更好的方法?

1 个答案:

答案 0 :(得分:2)

对于Groovy <2.5.0

您可以使用单个Map.findAll()方法来做到这一点:

a.findAll { k,v -> !(v in b) }

但是,请记住,此方法不会修改现有的a映射,但会创建一个新的映射。因此,如果您要修改存储在a变量中的地图,则必须重新分配它。

a = a.findAll { k,v -> !(v in b) }

对于Groovy> = 2.5.0

Groovy 2.5.x版为Map-removeAll引入了一个新的默认方法,该方法采用一个谓词,并根据该谓词从输入映射中删除元素。

a.removeAll { k,v -> v in b}