如何使findAll在第一个谓词上停止



我有一个问题,如果我能以某种方式让这个代码像这样工作:

如果它匹配第一个谓词:(it.controller == controllerName && it.actions.contains(actionName)),它只找到那些匹配这个谓词的谓词,而不会从下面的谓词中找到。

若它在第一个谓词中找不到任何内容,那个么它就转到第二个谓词,找到所有与第二个谓语匹配但不与第三个谓语匹配的内容。

ArrayList rule = rules.findAll {
(it.controller == controllerName && it.actions.contains(actionName)) 
||
(it.controller == controllerName && it.actions.contains("*")) 
||
(it.controller == "*" && it.actions.contains("*"))
}

使用findFirst(),以下是一些很好的参考:https://www.baeldung.com/java-stream-findfirst-vs-findany并通过谓词查找第一个元素

如果我正确理解了这个问题,这应该会起作用:

def filterFirst(List list, List<Closure> filters) {
return filters
.collect { list.findAll(it) }
.find { it.size() != 0 }
}

然后,只需进行

filterFirst(rules, [
{ it.controller == controllerName && it.actions.contains(actionName) },
{ it.controller == controllerName && it.actions.contains("*") },
{ it.controller == "*" && it.actions.contains("*") }
])

最新更新