【问题标题】:Drools: how to get a list with items with unique idsDrools:如何获取具有唯一 ID 的项目的列表
【发布时间】:2019-09-18 02:22:00
【问题描述】:

我在 Drools 中有一个复杂的对象。 对象 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( ) from a.bItems
           and
           c : C( ) from b.cItems;
           collectList( c )
       )
       eval( listOfC > 2)
    then
       // do whatever
    end

【问题讨论】:

    标签: list unique drools items


    【解决方案1】:

    如果您只对出现次数感兴趣,而不对出现次数本身感兴趣,那么您可以使用Set 来收集您的 ID。 Set 将为您消除重复项(假设您的 id 实现了相应的身份和平等检查):

    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
    

    请注意,我在相同的模式中包含了对集合大小的评估。您不需要为此使用额外的eval

    希望对你有帮助,

    【讨论】:

    • 我相信我可以为这个实体添加 equals() 和 hashCode() 但需要检查其余代码。
    • 我对更通用的解决方案非常感兴趣。这种规则风格将在我们的系统中经常出现。收集对象列表,然后根据一个或多个字段的值将其中的一些提取到另一个列表中。我想我需要一张地图或类似的东西,但在 Drools 中,我无法将地图与最初收集的对象组合成一个列表。
    • 一种选择可能是创建您自己的“自定义累积函数”库以满足您的特定需求。您可以在文档的此部分中阅读有关可插​​入累积函数的更多信息:docs.jboss.org/drools/release/latest/drools-docs/html_single/…
    猜你喜欢
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2012-04-18
    相关资源
    最近更新 更多