Grails 圣杯系列

Grails 圣杯系列,grails,collections,groovy,gorm,Grails,Collections,Groovy,Gorm,我想检查当前登录的用户角色是否在特定的角色列表中。但它可以是任意两个集合 基本上我想检查[x1,x3,x4]集合的任何成员是否包含在[x2,x3,x7]中 如何在Groovy(Grails)中实现这一点?将列表中的一个转换为一个集合,并使用该方法查找交集 def s1 = [x1,x3,x4] as Set s1.retainAll([x2,x3,xy]).size() > 0 将列表之一转换为集合,并使用该方法查找交点 def s1 = [x1,x3,x4] as Set s1.ret

我想检查当前登录的用户角色是否在特定的角色列表中。但它可以是任意两个集合

基本上我想检查[x1,x3,x4]集合的任何成员是否包含在[x2,x3,x7]中


如何在Groovy(Grails)中实现这一点?

将列表中的一个转换为一个集合,并使用该方法查找交集

def s1 = [x1,x3,x4] as Set
s1.retainAll([x2,x3,xy]).size() > 0

将列表之一转换为集合,并使用该方法查找交点

def s1 = [x1,x3,x4] as Set
s1.retainAll([x2,x3,xy]).size() > 0
您可以使用以下方法:

其他选择包括
!a、 intersect(b).empty
a.any{it in b}
但我认为
不相交的
解决方案是最直接的解决方案,而且(这里的胡乱猜测)可能是最有效的解决方案,因为它不需要中间集合或闭包(更新:嗯,揭示了它在引擎盖下做了一些时髦的事情……但是几乎所有的Groovy方法都做=P)。

您可以使用以下方法:


其他的选择是
!a.intersect(b).empty
a.any{it in b}
,但我认为
不相交的解决方案是最直接的,而且(这里的推测)可能是最有效的,因为它不需要中间集合或闭包(更新:嗯,揭示了它在幕后做了一些古怪的事情……但是几乎所有的Groovy方法都做了=P)。

你在应用程序中使用了什么安全插件?我问这个问题是因为可能有更好的方法来实现你的目标,例如在spring security core中使用
SpringSecurityUtils.ifanygrated
(如果使用角色层次结构,则应考虑角色层次结构,而直接重叠检查不会考虑)@IanRoberts我使用的是Spring Security,我绝对可以使用它。谢谢!你在应用程序中使用的是什么安全插件?我这样问是因为可能有更好的方法来实现你的目标,例如在Spring Security core use
SpringSecurityUtils中。如果被授予
(如果您使用的是角色层次结构,这应该考虑到角色层次结构,而直接重叠检查不会)。@IanRoberts我使用的是Spring Security,我绝对可以使用它。谢谢!Hiya,这可能很好地解决了问题……但如果您能对它的工作方式和原因提供一些解释,那就太好了:)别忘了,在堆栈溢出方面有很多新手,他们可以从你的专业知识中学到一两件事——你所知道的对他们来说可能不是那么简单。我很抱歉没有添加任何解释。但我认为代码很容易理解。我相信这对你和我都适用……但就在前几天,我在堆栈溢出方面帮助了一些人谁是5年级的学生…这样的人在堆栈溢出方面是受欢迎的-我们想确保他们感到受欢迎,并且有很多东西可以学习。你能不能只添加一句解释:你改变了什么,以及为什么改变使代码工作。嗨,这可能很好地解决了问题…但是如果你能提供e关于其工作原理和原因的一点解释:)别忘了,在堆栈溢出方面有很多新手,他们可以从你的专业知识中学到一两件事——你所知道的对他们来说可能不是那么简单。我很抱歉没有添加任何解释。但我认为代码很容易理解。我相信这对你和我都适用……但就在前几天,我在堆栈溢出方面帮助了一些人谁是5年级的学生…这些人在堆栈溢出方面是受欢迎的-我们希望确保他们感到受欢迎,并且有很多东西可以学习。请你只添加一句解释:你改变了什么,以及为什么改变使代码工作。
def a = [5, 4, 3]
def b = [7, 6, 5]

// a contains a member of b if they are not disjoint.
assert !a.disjoint(b)
assert a.disjoint([8, 7, 6])
def a = [1,2,3] 
    def b = [3,4,5]
    def result = false 
    a.each{it->
         if(b.contains(it))
         result =true
    }
    return result