遍历List并使用Drools选择正确的值



我有一个像这样的对象列表

public class BesPeople{
List<person>
}
public class person{
int height;
int weight;
int shoesize;
String votingRecord;
}

如果我输入一个5个人的列表,我想根据业务规则从这5个人中选出最好的人,我该怎么做呢?这是否可能还不太清楚。我所见过的所有例子都是基于一个对象来做什么的。

我可以只写一个stream().filter()并以这种方式找到正确的人,但这将是嵌入在源代码中的逻辑,我希望最终将一些复杂的业务逻辑从源代码中拉出来,并给予我们的业务更多的控制。

如果我所做的没有任何意义,我就把它都扔掉,然后为它写一些复杂的过滤逻辑。

基本上你要做的就是选择一个人然后验证没有"更好的";人。

作为一个例子,假设我们想要找到最高的人,那么我们将利用您的height属性。(我将假设你的person对象有一个getHeight方法。我还将假设在BesPeople中有一个getPeople()方法,因为您甚至忽略了在示例中命名该变量。

rule "Find tallest person"
when
BesPeople( $ppl: people )
$p: Person($h: height) from $ppl
not(Person( height > $h ) from $ppl)
then
// $p is the tallest, do whatever you want with them here
end

基本上,该规则做以下事情:

  • 我们从列表中获得一个Person并将其分配给变量$p。我们已经将变量$h赋值给被选中的人的身高。
  • 我们验证列表中不存在另一个身高大于$h
  • 的人
  • 因此,值$p指的是到达"then"时最高的人。条款/右侧

这显然是一个非常简单的例子,但你没有在你的问题中确切地定义"最佳"。如果你"最好"条件更复杂,你可能最终有多个规则,并写"失败";例如场景。如果你有一个具体的(更复杂的)"最佳";你可以打开一个单独的问题,关于如何让这种功能工作。

最新更新