Drools将一个对象的列表转换为另一个对象的列表



我有一个类a,其中包含豁免对象列表,我想迭代该列表,将其转换为WaiverInfo对象列表并插入到类B类型的对象。有可能在流口水中实现这一点吗?

class A {
List<Waiver> waivers;
}
class B {
List<WaiverInfo> waiverList;
}
class Waiver {
String code;
String name;
}
class WaiverInfo {
String code;
String name
}

嗯,这当然是可能的,而且不是特别困难。

我将假设您将'A'插入到规则中,并希望编写针对'B'的规则。我还将假设您不会在规则中插入任何'B'。

rule "Convert A to B"
when
not( B() )
$a: A()
then
B b = new B();
// do the conversion here in regular java
insert(b);
end
rule "Example - do something with B"
when
B( $waiverList: waiverList )
then
// ...
end

基本上,转换规则检查工作内存中没有B,但有A。如果满足这些条件,则在"then"中进行转换。结果被插入到工作记忆中。

第二个规则将触发,因为在第一个规则的insert之后工作记忆中存在B触发后续规则的重新计算。

注意,这个转换规则只有在工作内存中只有1个"A"时才有效。如果你有两个"A"实例,第一个将触发规则并转换并插入一个"B"。此时,转换规则将不再对fire有效,因此它将永远不会转换第二个'A'实例。

如果你确实有A的多个实例,有很多方法可以解决这个问题。例如,您可以在转换后收回每个A。但上面的例子通常是这样做的。