groovy 如何使findAll在第一个 predicate 上停止

frebpwbc  于 2022-11-01  发布在  其他
关注(0)|答案(2)|浏览(158)

我有一个问题,如果我能以某种方式使代码像这样工作:
如果它与第一个 predicate 匹配:(it.controller == controllerName && it.actions.contains(actionName)),它只找到与此 predicate 匹配的那些 predicate ,而不从下面的 predicate 中找到。
如果在第一个 predicate 中找不到任何内容,则会转到第二个 predicate ,并找到所有与第二个 predicate 匹配但与第三个 predicate 不匹配的 predicate 。

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

mbskvtky2#

如果我理解正确的话,这个问题应该可以解决:

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("*") }
])

相关问题