是否有一个简单的语法或便捷方法(没有自己循环)来检查Map
中List
中是否存在值?例如,我想要做的是:
def myList = []
myList.push([first: "John", last: "Doe"])
println myList.contains(it -> it.first == "John")
应该打印为true但语法不正确。基本上,我需要知道列表是否包含一个地图,以便在该地图中包含" first"关键是" John"。
答案 0 :(得分:4)
另一个更简单的检查可能是使用扩展运营商,如下所示
assert 'John' in myList*.first
<强>更新强>
对find
和in
的使用情况进行基准测试可以得出如果列表大小较小则会导致使用in
的结果。
Refer and run this GIST。结果可能会有所不同,但令人惊讶的是,当列表大小较小时,in
对find
的CPU消耗较少(如图所示,请参阅第一个结果)。以下是我编写此更新时记录的结果集。
user system cpu real
findTestWithSmallerListSize 571 0 571 598
inListTestWithSmallerListSize 411 0 411 411
findTestWithMatchPresentInEnd 2714872 43 2714915 2739768
inListTestWithMatchPresentInEnd 2266303 39 2266342 2431595
findTestWithMatchPresentInAverageCenter 2141836 39 2141875 2263714
inListTestWithMatchPresentInAverageCenter 2261387 37 2261424 2438485
findTestWithMatchPresentInFirst 1667364 27 1667391 1813254
inListTestWithMatchPresentInFirst 2288471 37 2288508 2425089
根据上述结果,我同意如果匹配出现在列表的开头或开头(上面的第4个结果),则find
完全有效。
答案 1 :(得分:3)
使用find可能是更好的解决方案:
def myList = []
myList.push([first: "John", last: "Doe"])
def exists = (myList.find{ it -> it.first == 'John'} ? true : false)
assert exists == true
exists = (myList.find{ it -> it.first == 'Jane'} ? true : false)
assert exists == false