美文网首页
Drools规则引擎-如果判断某个对象中的集合是否包含指定的值

Drools规则引擎-如果判断某个对象中的集合是否包含指定的值

作者: 程序新视界 | 来源:发表于2019-07-31 21:06 被阅读0次

    规则引擎集合相关处理

    在实际生产过程中,有很多关于集合的处理场景,比如一个Fact对象中包含有一个集合,而需要判断该集合是否包含某个值。而Drools规则引擎也提供了多种处理方式,比如通过from、contains、exists等进行操作,比较。

    当然也可以通过function函数来做相应的比较,在个在其他章节讲到过,就不在此赘述。下面重点以几个实例才进行讲解,在具体实践中根据具体情况来进行运用。

    实例

    省略掉基本的配置,直接看调用代码和规则代码。

    测试调用代码:

    public class ContainsDemo extends BaseDemo {
    
        public static void main(String[] args) {
    
            KieSession kieSession = getKieSession("containsVar");
    
            Corporation corporation = new Corporation();
            Set<Scope> scopes = new HashSet<>();
            scopes.add(new Scope("P2P"));
            scopes.add(new Scope("金融"));
            scopes.add(new Scope("区块链"));
            corporation.setScopes(scopes);
    
            Scope scope = new Scope("区块链");
    
            kieSession.insert(corporation);
            kieSession.insert(scope);
    
            kieSession.fireAllRules();
    
        }
    }
    

    相关实体类:

    @Data
    public class Corporation {
    
        private Set<Scope> scopes;
    
    }
    
    @Data
    public class Scope {
    
    
        public Scope(String scope){
            this.scope = scope;
        }
    
        private String scope;
    
    }
    

    然后看一下规则处理:

    package com.containsVar
    
    import com.secbro2.drools.entity.Corporation
    import com.secbro2.drools.entity.Scope
    import java.util.List
    
    rule "containsVar1"
    
    when
    
        $c: Corporation($scopes:scopes);
        $s: Scope(scope == "P2P") from $scopes;
    
    then
    
        System.out.println("containsVar1行业类型为:P2P");
    end
    
    rule "containsVar2"
    
    when
    
        $c: Corporation($scopes:scopes);
        exists (Scope(scope == "P2P") from $scopes);
    then
    
        System.out.println("containsVar2行业类型为:P2P");
    
    end
    
    
    rule "containsVar3"
    
    when
        $s: Scope(scope == "区块链")
        $c: Corporation(scopes contains $s);
    then
    
        System.out.println("containsVar3行业类型为:区块链");
    
    end
    
    rule "containsVar4"
    
    when
        $s: Scope(scope == "区块链")
        exists (Corporation(scopes contains $s));
    then
    
        System.out.println("containsVar4行业类型为:区块链");
    
    end
    

    在上述实例中列举了4中使用方法:

    • 第一种,首先获取Fact对象Corporation,并重新定义了它的属性scopes。然后,通过from关键字来遍历scopes中的值,获得符合条件的。此时并不需要传入Scope对应的fact对象。
    • 第二种,前半部分同第一种方式,是不过没有获取筛选的结果,直接用exists来判断是否存在。
    • 第三种,先获得满足条件的Scope的Fact对象,然后再利用此fact对Corporation的fact对象进行筛选,只有满足条件才可以继续。
    • 第四种,与第三种效果相同,原理同第二种方式的exists使用。

    相关技术视频

    CSDN学院:《Drools7规则引擎进阶教程》

    CSDN学院:《Drools7规则引擎入门教程》

    CSDN学院:《Drools7系列优惠套餐》

    原文链接:http://www.choupangxia.com/2019/07/31/drools%e8%a7%84%e5%88%99%e5%bc%95%e6%93%8e-%e5%a6%82%e6%9e%9c%e5%88%a4%e6%96%ad%e6%9f%90%e4%b8%aa%e5%af%b9%e8%b1%a1%e4%b8%ad%e7%9a%84%e9%9b%86%e5%90%88%e6%98%af%e5%90%a6%e5%8c%85%e5%90%ab%e6%8c%87/

    相关文章

      网友评论

          本文标题:Drools规则引擎-如果判断某个对象中的集合是否包含指定的值

          本文链接:https://www.haomeiwen.com/subject/ayexdctx.html