如何从 Drools 的列表中获取最大最小项目

How to get max min item from a list in Drools

我有一个class

class Person {
    public Date dateOfBirth;
    public List<Person> children;
}

我想创建一个让我成为最老 child 的 Drools 规则。例如:

rule "Oldest Child"
    when
        $person: Person()
        $oldestChild: Person() from $person.children
    then
        insert($oldestChild)
end

正如所写,$oldestChild 是一个列表,但我真的很想成为真正最老的 child(单个 object 而不是列表)。我玩了一下 accumulate ,但无法让它发挥作用。有什么想法吗?

使用内联自定义代码的累积生成最老的子项:

rule "oldest child"
when
  Person($pn: name, $pd: dateOfBirth, $children: children)
  Person($ocn: name) from accumulate(
    $child: Person( $cd: dateOfBirth) from $children,        
    init( Person minp = null; Date mind = new Date(); ),
    action( if( $cd.compareTo( mind ) < 0 ){
                minp = $child;
                mind = $cd;
            } ),
    result( minp ) )
then
  System.out.println( $pn + "'s oldest child is " + $ocn );
end

如果您需要它来进行严肃的工作,您可以实现自己的累积函数(在 Java 中)- 它的工作量更大,但 "cleaner" 解决方案。请参阅文档。

另一种不累积的方式:

rule "Oldest Child"
when
    $person: Person()
    $oldestChild: Person() from $person.children
    not Person(dateOfBirth > $oldestChild.dateOfBirth) from $person.children
then
    insert($oldestChild)
end

我认为这个解决方案可能比 Laune 的性能更差。