如何检查列表是否包含Groovy中另一个列表中的值或键?

时间:2016-07-13 12:37:56

标签: groovy

如何检查列表是否包含子列表(子列表...)或“根”中的键或值 并且有可能获得“路径”吗?

这个containsValue或containsKey似乎只是查看列表的根

伪示例:

//This is my list
list = [languages:[_clazz:"basics.i18n.Language", messages:[_clazz:"basics.i18n.Message"]]] 

list.containsKey("languages") // return true
list.containsValue("basics.i18n.Language") // return false where I want true
list.containsKey("messages") // return false // return false where I want true
list.containsValue("basics.i18n.Message") // return false where I want true

1 个答案:

答案 0 :(得分:5)

Groovy中没有任何内容我不会这么想,但你可以编写自己的内容并将其添加到Map(你拥有的是Map,而不是List,因为您已将变量命名为

Map.metaClass.deepContainsKey = { value ->
    delegate.containsKey(value) ?:
    delegate.values().findAll { it instanceof Map }.findResult { it.deepContainsKey(value) } ?:
    false
}

Map.metaClass.deepContainsValue = { value ->
    delegate.containsValue(value) ?:
    delegate.values().findAll { it instanceof Map }.findResult { it.deepContainsValue(value) } ?:
    false
}

然后,给出你的地图:

def map = [languages:[_clazz:"basics.i18n.Language", messages:[_clazz:"basics.i18n.Message"]]] 

所有这些断言都通过了:

assert map.deepContainsKey("messages") 
assert map.deepContainsValue("basics.i18n.Message")
assert map.deepContainsValue("basics.i18n.Language")

assert !map.deepContainsKey("missing") 
assert !map.deepContainsValue("novalue")