List Drools:如何获取具有唯一ID的项目列表
我有一个复杂的物体在流口水。 对象A包含对象B的列表。 对象B包含对象C的列表 对象C具有属性id。对象C可以出现在具有相同id的不同对象B上 我需要能够计算A中唯一ID的数量 当id不重复时,我当前的规则有效。但是我如何在没有重复ID的情况下获得listOfCList Drools:如何获取具有唯一ID的项目列表,list,unique,drools,items,List,Unique,Drools,Items,我有一个复杂的物体在流口水。 对象A包含对象B的列表。 对象B包含对象C的列表 对象C具有属性id。对象C可以出现在具有相同id的不同对象B上 我需要能够计算A中唯一ID的数量 当id不重复时,我当前的规则有效。但是我如何在没有重复ID的情况下获得listOfC rule CountCs dialect "mvel" when a : A( ) listOfC: List( ) from accumulate ( b : B(
rule CountCs
dialect "mvel"
when
a : A( )
listOfC: List( ) from accumulate (
b : B( ) from a.bItems
and
c : C( ) from b.cItems;
collectList( c )
)
eval( listOfC > 2)
then
// do whatever
end
如果您只对出现的次数感兴趣,而对出现的次数本身不感兴趣,那么您可以使用
Set
来收集您的ID。集合
将为您消除重复项(假设您的ID执行了相应的身份和平等性检查):
注意,我在同一模式中包含了对集合大小的评估。您不需要为此使用额外的eval
希望有帮助,我相信我可以为这个实体添加equals()和hashCode(),但需要检查其余的代码。我对更通用的解决方案非常感兴趣。这种规则在我们的系统中会经常出现。收集一个对象列表,然后根据一个或多个字段的值将其中一些对象拉入另一个列表。我想我需要一个映射或类似的东西,但在Drools中,我无法将映射与对象的初始集合合并到一个列表中。一个选项是为您的特定需要创建自己的“自定义累积函数”库。在本节文档中,您可以阅读更多关于可插拔累积函数的信息:
rule CountCs
dialect "mvel"
when
a : A( )
setOfC: Set( size > 2 ) from accumulate (
b : B( ) from a.bItems
and
c : C( ) from b.cItems;
collectSet( c.id )
)
then
// do whatever
end