Grails检查列表中的值为map

时间:2014-07-12 15:20:53

标签: groovy

是否有一个简单的语法或便捷方法(没有自己循环)来检查MapList中是否存在值?例如,我想要做的是:

​def myList = []
myList.push([first: "John", last: "Doe"])
println myList.contains(it -> it.first == "John")

应该打印为true但语法不正确。基本上,我需要知道列表是否包含一个地图,以便在该地图中包含" first"关键是" John"。

2 个答案:

答案 0 :(得分:4)

另一个更简单的检查可能是使用扩展运营商,如下所示

assert 'John' in myList*.first

<强>更新
findin的使用情况进行基准测试可以得出如果列表大小较小则会导致使用in的结果。

Refer and run this GIST。结果可能会有所不同,但令人惊讶的是,当列表大小较小时,infind的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​