Drools7 中Map类型数据源操作

本文介绍了Map类的数据源在drools的condition部分遍历的方法。

1.entity

public class SimpleEntity {
	private Integer id;
	private Date date;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}
	
	
}

2.创建并加入数据源

SimpleEntity se = new SimpleEntity(); 
se.setId(6);
se.setDate(new Date());
Map map = new HashMap();
map.put("12", se);
kSession.insert(map);
kSession.fireAllRules();

 3.DRL文件

//从数据源中取出key="12" 的map,并打印map中SimpleEntity的id的值
rule "Your First Rule1_1"

    when
       
       //$map:Map(['12'] != null)//错误的写法

      	$map:Map(this['12'] != null)//正确写法
    then
        //actions
        System.out.println("SimpleEntity.id:"+((SimpleEntity)$map.get("12")).getId());
	
end

执行结果:SimpleEntity.id:1

//获取Map ,其key="12",并且map中的SimpleEntity的id属性大于0
rule "Your First Rule1_1"

    when
       
       //$map:Map(['12'] != null,this['12'].id > 0)//错误的写法
        
      	$map:Map(this['12'] != null,this['12'].id > 0)//正确的写法
    then
        //actions
        System.out.println("SimpleEntity.id:"+((SimpleEntity)$map.get("12")).getId());
	
end

执行结果:SimpleEntity.id:1

说明:['12'] 和 this['12'] 的区别是前者获得是Map对象本身,后者是map中的value中的值。this['12'].id 还可以写成 this.get('12').getId()。

 

错误更正:

condition部分判断内存中是否有一个key="12"的一个Map

正确的写法如下:

$map : Map(this['12'] != null);

之前错误的写法是 :

$map : Map(['12'] != null ),这样写是错误的,因为无论内存中是否有key="12"的Map,只要内存中有任意一个Map,那么这个条件就会判断为 true ,错误是致命,希望没有误导别人。

       如果工作内容中存在多个规则匹配的Map,但是规则只允许触发一次的话以上操作方式是做不到,这时候需要用到accumulate函数了,关于这个函数的一些语法和使用技巧我在另一篇文章分享(点击查看)。

补充:map实例键值对遍历,点击这里查看

你可能感兴趣的:(Drools)