如何在Drools中编写列表containsAny与containsAll的判断规则?
针对你的需求,我来分享一下Drools中实现这两种集合判断规则的常用方式——优先用内置操作符会更简洁易读,也可以用显式遍历的方式实现,两种都给你列出来:
1. 判断Master的groups包含Customer的groups中任意元素(containsAny)
这本质是判断两个集合是否有交集,Drools内置了overlaps操作符可以直接实现:
rule "Master Shares Any Group With Customer" when // 从工作内存中匹配一个Master实例 $master: Master() // 匹配与Master的groups有交集的Customer实例 $customer: Customer(groups overlaps $master.groups) then // 这里写规则触发后的业务逻辑,比如打印日志或更新数据 System.out.println("Master " + $master + " has at least one common group with Customer " + $customer); end
如果你偏好更直观的显式判断,也可以通过遍历Customer的groups元素来实现:
rule "Master Contains Any Customer Group (Explicit Check)" when $master: Master($masterGroups: groups) $customer: Customer($customerGroups: groups) // 只要Customer的groups中有一个元素存在于Master的groups中,就触发规则 $group: String() from $customerGroups $group memberOf $masterGroups then System.out.println("Master includes group '" + $group + "' from Customer " + $customer); end
2. 判断Master的groups包含Customer的groups中所有元素(containsAll)
这对应子集判断,Drools的subsetOf操作符可以直接验证Customer的groups是否是Master的groups的子集:
rule "Master Contains All Customer Groups" when $master: Master() // 检查Customer的groups是否完全被Master的groups包含 $customer: Customer(groups subsetOf $master.groups) then System.out.println("Master " + $master + " contains every group from Customer " + $customer); end
同样,也可以用显式的方式确保Customer的所有groups元素都在Master的groups中:
rule "Master Contains All Customer Groups (Explicit Check)" when $master: Master($masterGroups: groups) $customer: Customer($customerGroups: groups) // 验证不存在任何一个Customer的group不在Master的groups中 not( String(this not memberOf $masterGroups) from $customerGroups ) then System.out.println("Master includes all groups of Customer " + $customer); end
内容的提问来源于stack exchange,提问作者Rohit Raman Das
相关产品推荐
相关产品推荐

