我正试着用口水来处理列表。我正在传递一个请求,其中包含了一个购买清单。我想做几个规则,包括检查大小是否正确,如果所有元素是相同的,如果所有购买都是授权的,.我有下面的代码,但是我在处理列表时遇到了问题。这样做对吗?尤其是在检查尺寸的时候?
import com.rules.Purchase
import com.rules.PurchaseRequest
dialect "mvel"
global Boolean eligibleForRefund
rule "Check for list not equal to two elements" salience 10
when
PurchaseRequest(getPurchases != null, getPurchases.size() != 2)
then
drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end
rule "Check for two purchases" salience 9
when:
$purchaseRequest: PurchaseRequest()
Number(intValue != 2) from accumulate(Purchase(getStatus() == "Approved") from $purchaseRequest.getPurchases(), count(1))
then
drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end
rule "Check for the same purchases" salience 8
when:
$purchaseRequest: PurchaseRequest()
then
firstPurchase = $purchaseRequest.getPurchases().get(0).getCost();
hasAllElements = true;
for (Purchase purchase : $purchaseRequest.getPurchases()) {
if (purchase.getCost() != firstPurchase) {
hasAllElements = false;
}
}
drools.getKieRuntime().setGlobal("eligibleForRefund", hasAllElements);
end发布于 2021-08-04 20:59:42
假设类定义如下所示:
class PurchaseRequest {
private List<Purchase> purchases;
public List<Purchase> getPurchases() { return this.purchases; }
}您应该从持有者中提取引用,而不是通过getter不断地与事物交互。在其他项目中,这有助于保持数据的一致性,特别是与共享资源一致。回想一下,如果您有一个名与getXyz格式匹配的getter,您可以简单地将其称为xyz,drools将自动地将其映射到getter函数。这允许我们通过PurchaseRequest( $purchases: purchases )获得购买,因为purchases将映射到getPurchases()。(请注意,如果购买碰巧是一个公共变量,那么它应该首先映射到该变量;但是由于它是私有的,所以它回到了遵循bean命名约定的公共getter上。)
其次,在一个非常简单的场景中使用accumulate,其中collect可能更合适。通常,对于更复杂的“获取类似于此的东西”的情况,您可以使用accumulate;但是对于简单的匹配,集合也同样有效。
第三条规则需要做的工作最多。您不希望在规则的右侧执行这种业务逻辑。有很多方法可以用来检查所有元素是否都是相同的--如果您已经实现了等于/hashCode,您可以将所有内容都插入到一个集合中,并确认集合的长度仍然是列表的长度;您可以倒转规则来检查至少一个不同的项;您可以使用累积或收集;
最后--
rule "Check for list not equal to two elements"
salience 1
when
PurchaseRequest($purchases: purchases != null)
List(size != 2) from $purchases
then
drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end
rule "Check for two purchases"
salience 1
when:
PurchaseRequest( $purchases: purchases != null)
List( size != 2 ) from collect( Purchase(status == "Approved") from $purchases)
then
drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end
// I've no idea what data type `getCost()` returns; I'm assuming "String"
rule "Check for the same purchases"
when:
PurchaseRequest($purchases: purchases != null)
// accumulate all of the costs into a set. if all costs are the same, set size = 1
$costs: Set() from accumulate( Purchase( $cost: cost ) from $purchases;
collectSet($cost))
then
drools.getKieRuntime().setGlobal("eligibleForRefund", $costs.size() == 1);
endhttps://stackoverflow.com/questions/68657387
复制相似问题