Drools中如何更简洁地实现KieSession内重复POJO校验?
可以用Drools原生的accumulate语法实现,不需要自定义函数,写法和你提到的求和语法非常类似。
注意:所有判重逻辑生效的前提是,你需要为A类基于业务判重字段(someInt、someString)正确重写equals()和hashCode()方法。
方案1:单accumulate高效判重(推荐)
仅需一次聚合即可判断是否存在重复,性能最优,只要出现第一个重复就会触发规则,不需要全量统计:
dialect "java" rule "ADuplicateRule" when $hasDuplicate: Boolean(this == true) from accumulate( $a: A(), init(Set<A> set = new HashSet<>(); boolean hasDup = false;), action(if(!set.add($a)) hasDup = true;), reverse(set.remove($a);), result(hasDup) ) then throw new Exception("A类POJO存在重复值"); end
方案2:基于count+collectSet的简洁写法
和你提到的求和语法风格完全一致,可读性高:
dialect "java" rule "ADuplicateRule" when $total: Number() from accumulate(A(), count()) $distinctTotal: Number() from accumulate(A(), collectSet(this).size()) eval($total > $distinctTotal) then throw new Exception("A类POJO存在重复值"); end
方案3:匹配具体重复实例
如果需要拿到重复的具体实例做后续处理(比如打印重复字段、标记异常数据),可以用更简单的对象匹配写法,不需要聚合:
dialect "java" rule "ADuplicateRule" when // 匹配两个不同的A实例,业务字段完全一致 $a1: A($someInt: someInt, $someStr: someString) $a2: A(this != $a1, someInt == $someInt, someString == $someStr) then throw new Exception("存在重复A类POJO,重复字段:someInt=" + $someInt + ",someString=" + $someStr); end
内容的提问来源于stack exchange,提问作者Imposter
相关产品推荐
相关产品推荐

