背景
技术交流群中,不少朋友在问,如何在Drools规则文件中使用Map。今天就用实例带大家了解一下map的使用方法。
实例代码
测试部分代码:
-
@Test
-
public void testMapUsage() {
-
KieSession kieSession = this.getKieSession("map-group");
-
-
Map<String, Person> map = new HashMap<>();
-
Person p1 = new Person();
-
p1.setAge(10);
-
map.put("p1",p1);
-
-
Person p2 = new Person();
-
p2.setAge(20);
-
map.put("p2",p2);
-
-
kieSession.insert(map);
-
-
int count = kieSession.fireAllRules();
-
System.out.println("Fire " + count + " rule(s)!");
-
-
}
首先,我们创建了一个map,map中存放了两个Person对象,随后将map insert到了session中。其中这两个Person的年纪是不同的。 下面看一下规则代码:
-
package com.rules
-
import java.util.Map;
-
import com.secbro.drools.model.Person;
-
-
rule "map-usage"
-
-
agenda-group "map-group"
-
-
when
-
$obj : Object();
-
$map : Map(["p1"] != $obj);
-
then
-
System.out.println("p1's age is " + ((Person)$map.get("p1")).getAge());
-
System.out.println("p2's age is " + ((Person)$map.get("p2")).getAge());
-
end
规则中首先定义了一个Object对象,此对象肯定是存在的。另外就是给map定义一个变量,获取了map中key为p1的对象,并比较p1这个对象与$obj对象是否相当,不相等的话满足条件。在上面的过程中实现了一种从map获取对象的方法。
然后再看一下RHS部分,直接使用get方法从map中获取值,并强转为原始的对象,调用对象的对应方法。
执行结果如下:
-
p1's age is 10
-
p2's age is 20
-
Fire 1 rule(s)!
以上完整代码请于github上下载:https://github.com/secbr/drools 。