我有一个问题,如果我能以某种方式让这个代码像这样工作:
如果它匹配第一个谓词:(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("*") }
])