首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图中值的Grails检查列表

图中值的Grails检查列表
EN

Stack Overflow用户
提问于 2014-07-12 15:20:53
回答 2查看 1.6K关注 0票数 2

是否有一种简单的语法或方便的方法(不用自己循环)来检查一个值是否存在于Map中( List中)?例如,我想做的是:

代码语言:javascript
复制
​def myList = []
myList.push([first: "John", last: "Doe"])
println myList.contains(it -> it.first == "John")

应该打印true,但语法不正确。基本上,我需要知道列表是否包含一个映射,在该映射中,“第一个”键的值是"John“。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-12 15:23:49

使用find可能是一个更好的解决方案:

代码语言:javascript
复制
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​
票数 3
EN

Stack Overflow用户

发布于 2014-07-12 18:34:06

另一个更简单的检查可能是使用spread操作符,如下所示

代码语言:javascript
复制
assert 'John' in myList*.first

更新

如果列表大小较小,则对findin之间的性能进行基准测试提供了倾向于使用in的结果。

Refer and run this GIST。结果可能会有所不同,但令人惊讶的是,当列表大小较小时,in相对于find消耗的CPU更少(如问题所示,请参阅第一个结果)。下面是在我编写此更新时记录的结果集。

代码语言:javascript
复制
                                              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

基于上述结果,我同意,如果匹配出现在列表的开头或开始处(上面的第四个结果),那么find是完全有效的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24714360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档