我正在尝试流口水。
我遇到过这种情况,我想将同一类的 2 个不同的 java 对象插入到 Drools 中,并在每个规则中使用这两个对象。
例如:
假设我有两个同一类的 java 对象,它们具有几乎相同的变量。
类看起来像这样。
public class Sample{
Map<String,String> map;
sample(Map<String,String>map){
this.map = map;
}
}
对象:
Map<String,String>map1 = new Map<>();
map1.put("name","james");
Map<String,String>map2 = new Map<>();
map2.put("name","james");
map2.put("id","123k");
Sample obj1 = new Sample(map1);
Sample obj2 = new Sample(map2);
这 2 个对象 obj1,obj2
仅在映射中的键数量不同。
如果我在运行规则之前将这两个对象插入knowledgeSession中,我如何在同一规则中使用这两个对象?如何区分同一规则中的对象,以便我有机会使用这两个对象在规则的when子句中。
插入 session 看起来像这样:
private static StatefulSession sessionObject;
sessionObject.insert(obj1);
sessionObject.insert(obj2);
sessionObject.fireAllRules(1);
如何区分规则中的对象,以便从以下示例代码中 $obj1 接收 object1
和 $obj2 接收 object2
。
import com.sample.client.Sample;
rule "1"
when
$obj1 : Sample()
$Obj2 : Sample()
........
then
........
........
end
处理基本数据类型很容易,但是上面这种情况,提取java对象中的map信息来区分对象至关重要,如何处理呢?
最佳答案
如果您不关心哪个对象绑定(bind)到哪个变量,那么您可以这样做:
rule "1"
when
$obj1 : Sample()
$obj2 : Sample(this != $obj1)
then
end
如果您确实需要将 $obj1
分配给 obj1
并将 $obj2
分配给 obj2
,那么您需要一些东西来唯一地标识您的对象。也许可以向 Sample
类添加 id
属性,或者使用映射中的特定键来指定 id。例如:
rule "1"
when
$obj1 : Sample(map["id"] == "123k")
$obj2 : Sample(map["id"] == "456k")
then
end
编辑:
需要注意的是,即使对于 2 个 Sample
事实,第一条规则仍会匹配多次。
希望对你有帮助
关于java - 将多个同一类的java对象插入到java中的drools中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34299239/