我正在努力使用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; }
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试找到正确的语法来收集"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
Run Code Online (Sandbox Code Playgroud)
我知道它可以用这样的方式编写,其中每个元素迭代匹配但我只想触发一次动作并且如果有任何匹配则有一个A的List.谢谢!
这不可能是"收集",因为在收集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 )
)
Run Code Online (Sandbox Code Playgroud)
后来
如果listOfA中的元素被多次选中时列表元素只出现一次,只需使用Set和collectSet.