我正在努力使用 DROOL 中的模式匹配例程,该例程遍历复杂嵌套对象的列表。
我有一个像这样的 POJO 结构:
class MyFact {
private List<A> listOfA;
public List<A> getListOfA() { return listOfA; }
}
class A {
private List<B> listOfB;
private String stringField;
public List<B> getListOfB() { return listOfB; }
public String getStringField() { return stringField; }
}
class B {
private String otherStringField;
public String getOtherStringField() { return otherStringField; }
}
我试图找到正确的语法来收集与一组条件匹配的所有类型为“A”的对象,这些条件还包括包含在“A”中的对象中的匹配字段
listOfB
.我认为规则需要看起来像这样,但是当它在
collect( ... )
中时我不会编译该模式import java.util.ArrayList;
rule "Tricky Syntax"
when
$myFact: MyFact()
$filteredListOfA: ArrayList( size > 0 ) from collect (
A( stringField == "something", $listOfB: listOfB ) from $myFact.listOfA
B( otherStringField == "somethingElse" ) from $listOfB
)
then
// Do something neat with $filteredListOfA
end
我知道它可以以这样一种方式编写,其中每个元素都迭代匹配,但我只想触发一次操作,如果有任何匹配,则有一个 A 列表。
谢谢!
最佳答案
这不可能使用“collect”,因为在 collect CE 中不可能有多个模式。 (您的意思是收集 A 或 B 或两者?)您可以轻松地将其更改为累积,这使您可以完全控制累积的内容:
$myFact: MyFact()
$filteredListOfA: List( size > 0 ) from accumulate (
$a: A( stringField == "something", $listOfB: listOfB ) from $myFact.listOfA
and
B( otherStringField == "somethingElse" ) from $listOfB;
collectList( $a )
)
以后
如果 listOfA 中的元素被多次选择时列表元素应该只出现一次,只需使用
Set
和 collectSet
.
关于DROOLS 模式匹配具有复杂对象的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326773/