You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:36:02