如何让Groovy的findAll方法按谓词优先级匹配并停止后续查找
Groovy规则匹配逻辑调整方案
直接按优先级分步处理即可,先筛选第一个谓词的结果,若不为空则返回;否则再筛选符合第二个谓词但排除第三个的结果:
// 先获取精准匹配的规则 def exactMatches = rules.findAll { it.controller == controllerName && it.actions.contains(actionName) } // 如果有精准匹配,直接返回;否则返回控制器匹配且动作是*但排除全局通配的规则 ArrayList rule = exactMatches ?: rules.findAll { (it.controller == controllerName && it.actions.contains("*")) && !(it.controller == "*" && it.actions.contains("*")) }
逻辑说明
- 第一步先筛选精准匹配的元素:控制器完全匹配且包含指定动作的规则
- 若精准匹配结果不为空,直接使用该结果,不再处理后续逻辑
- 若精准匹配无结果,再筛选**控制器匹配且动作为通配符
*的规则,同时排除全局通配(控制器和动作都是*)**的规则
这样就完全符合要求的优先级逻辑,避免了原代码中多个||导致的优先级混淆问题。
内容的提问来源于stack exchange,提问作者funnyguy
相关产品推荐
相关产品推荐

