Drools-如何比较存在于列表中的Java对象中的字符串值 [英] Drools - how do I compare a string value present in a Java Object which is present inside a List

查看:17
本文介绍了Drools-如何比较存在于列表中的Java对象中的字符串值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是口水新手,在编写规则时遇到困难 以下是我的数据结构:

public class Premium{
   private List<InsuranceType> insuranceTypes;
}

public class InsuranceType {
   private String name;
}

因此,Premium对象将包含保险类型列表,我需要检查是否有任何保险类型的名称为&qot;tpd";

我尝试了以下方法:

rule "rule#3"
when
    $fact:Premium($insuranceTypes : InsuranceType(name == 'TPD'))
then
    System.out.println("Error");
end 

但是应用服务器无法启动,出现以下错误:

2021-11-30 12:16:37.004 ERROR 23500 --- [           main] 
o.d.c.k.builder.impl.AbstractKieModule   : Unable to build KieBaseModel:defaultKieBase
Unable to Analyse Expression InsuranceType(name == "TPD"):
[Error: unable to resolve method using strict-mode: com.xyz.Premium.name()]
[Near : {... InsuranceType(name == "TPD") ....}]
                       ^
[Line: 29, Column: 5] : [Rule name='rule#3']
Unable to analyze expression 'InsuranceType(name == "TPD")' : [Rule name='rule#3']
Field Reader does not exist for declaration '$insuranceTypes' in '$insuranceTypes : 
InsuranceType(name == "TPD")' in the rule 'rule#3' : [Rule name='rule#3']

保险

我将假定推荐答案类上有一个公共getName方法,Premium类上有一个公共getInsuranceTypes方法。如果这两个都不是真的,则需要添加getter或将这些属性设置为公共属性。


您的规则非常接近。但是,您遇到的问题是insuranceTypes是一个列表,但您将其视为对象。

根据您的需要,您可以在此处选择多个选项。然而,我会选择最简单的,即:

rule "Example"
when
  Premium( $insuranceTypes: insuranceTypes )
  exists( InsuranceType( name == "TPD" ) from $insuranceTypes )
then
  System.out.println("Error");
end
在第一行中,我获取保险类型并将它们赋给变量$insuranceTypes。此变量现在是类型列表。

然后在第二行中,我断言列表中至少存在一个名称为&Quot;TPD&Quot;的保险类型。


注意,Drools还有一个memberOf运算符和一个contains运算符,这两个运算符在处理列表和其他可迭代集合时非常有用。这些是彼此相反的,例如。您会选择Example( foo memberOf $someList )Example( myList contains $something )

这篇关于Drools-如何比较存在于列表中的Java对象中的字符串值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆