繁体   English   中英

(Drools) 如何遍历一个列表来检查一个项目是否是另一个列表的成员

[英](Drools) How to loop through a list to check if an item is a memberOf another list

我想检查诊断代码列表中的任何项目是否存在于另一个列表中。

我是流口水的新手,并且仍在尝试确定最佳方法,因为当前的方法不起作用(output 说 null 当它应该返回“真”时)。

Java POJO

public class EligibilityDomainObject {
    
    private List<String> listOfString;  
    public List<String> getListOfString() {  
         return listOfString;  
    }  
    public void setListOfString(List<String> listOfString) {  
         this.listOfString = listOfString;  
    }  
    public void addString(String value) {  
         if (listOfString == null) {  
              listOfString = new ArrayList<String>();  
         }  
         listOfString.add(value);  
    }  
    private Boolean isComplexPhysicalHealth;
    public Boolean getIsComplexPhysicalHealth() {
        return this.isComplexPhysicalHealth;
    }

    public void setIsComplexPhysicalHealth(Boolean isComplexPhysicalHealth) {
        this.isComplexPhysicalHealth = isComplexPhysicalHealth;
    }

流口水

rule "Problems related to social environment"
    when
        $eligibilityDomainObject:EligibilityDomainObject($listOfString : listOfString,
            $listOfString memberOf "F77 EOO F99" )
    then
        $eligibilityDomainObject.setIsComplexPhysicalHealth(true);
end

主要的

    public static void main(String[] args) {
        SpringApplication.run(RulesEngineApplication.class, args);
        

        try {
            KieServices kieServices = KieServices.Factory.get();
            KieContainer kContainer = kieServices.getKieClasspathContainer();

            KieSession kSession = kContainer.newKieSession("ksession-rules");
            
            EligibilityDomainObject eligibilityDomainObject = new EligibilityDomainObject(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);

            eligibilityDomainObject.addString("F77");
            eligibilityDomainObject.addString("F99");
            System.out.println("List of diagnosis codes: "+ eligibilityDomainObject.getListOfString().toString());
            kSession.insert(eligibilityDomainObject);
            System.out.println("complex phys health flag: "+ eligibilityDomainObject.getIsComplexPhysicalHealth());
            kSession.fireAllRules();
            kSession.dispose(); 
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

output

诊断代码列表:[Z590、E0800]

复杂的物理健康标志:null

预计 output

诊断代码列表:[Z590、E0800]

复杂的物理健康标志:真

我能够使用'from'关键字解决它

rule "Problems related to social environment"
    when
        $eligibilityDomainObject:EligibilityDomainObject($listOfString : listOfString)
            value: String(value memberOf "F77 EOO F99" ) from $listOfString
    then
        $eligibilityDomainObject.setIsComplexPhysicalHealth(true);
end

您的规则将对F7F9行为不端。

考虑其他几种方法:

rule "Problems related to social environment"
    when
        $eligibilityDomainObject:EligibilityDomainObject($listOfString : listOfString)
            value: String(value in ("F77", "EOO", "F99") ) from $listOfString
    then
        $eligibilityDomainObject.setIsComplexPhysicalHealth(true);
end

根据文档,当您可以将所有事实插入 Drools 引擎的工作 memory 或在约束表达式中使用嵌套的 object 引用时,需要“避免使用 from 元素。” 以下将导致每个 EligibilityDomainObject 仅触发一次规则,而不是每个匹配值:

import static org.apache.commons.collections4.CollectionUtils.containsAny;

rule "Problems related to social environment"
    when
        $eligibilityDomainObject:EligibilityDomainObject(containsAny(listOfString, "F77", "EOO", "F99"))
    then
        $eligibilityDomainObject.setIsComplexPhysicalHealth(true);
end

在一个 go 中收集匹配值

import static org.apache.commons.collections4.CollectionUtils.intersection;
import static com.google.common.collect.Sets.newHashSet;

rule "Problems related to social environment"
    when
        $eligibilityDomainObject:EligibilityDomainObject(
            $values : intersection(listOfString, newHashSet("F77", "EOO", "F99")), 
            !$values.isEmpty())
    then
        $eligibilityDomainObject.setIsComplexPhysicalHealth(true);
        System.out.println($values);
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM