深入浅析drools中Fact的equality modes

深入浅析drools中Fact的equality modes

在drools中,我们经常会使用Fact来表示我们的规则中所需要的对象或者数据。在使用Fact的时候,我们需要考虑到Fact的Equality Modes(等值模式)问题。Equality Modes决定了如何比较两个Fact是否相等,进而对整个规则的执行结果产生影响。下面我们详细介绍一下drools中Fact的Equality Modes。

Equality Modes的种类

在drools中,我们有三种Equality Modes:

  1. STRICT: 严格匹配模式,即只有完全相同的两个Fact才能被认为是相等的。
  2. EQUALITY: equal模式,即只有规定的单个或多个字段的值相等的两个Fact才能被认为是相等的。
  3. IDENTITY: 唯一标识模式,即只有两个Fact对象的内存地址相等时才认为是相等的。

Equality Modes的使用

我们可以通过在定义规则时使用注解的方式来设置Fact的Equality Modes方式,例如:

@org.kie.api.definition.type.PropertyReactive(mode = PropertyReactiveMode.EQUALITY)
public class Person {
  private String name;
  private int age;
  // ...
}

上述示例中,我们通过在Person类上使用注解的方式来设置Person使用EQUALITY模式。

EQUALITY模式的示例

接下来,我们举两个EQUALITY模式的示例:

示例1:EQUALITY模式的使用

rule "Person is Over 18"
when
  $p1: Person($age1 : age >= 18)
  $p2: Person(age == $age1, name != $p1.name)
then
  System.out.println($p1.getName() + " and " + $p2.getName() + " are both over 18.");
end

上述规则查找Person集合中年龄在18岁以上的人,同时输出任意两个年龄在18岁以上的人的姓名。因为在定义Person时使用了注解,所以使用了EQUALITY模式。

示例2:STRICT模式下的equal方法被调用

rule "Person is same age and name"
when
  $p1: Person($name : name, $age : age)
  $p2: Person(name == $name, age == $age)
  eval($p1.equals($p2))
then
  System.out.println($p1.getName() + " and " + $p2.getName() + " are the same age and have the same name.");
end

上述规则查找Person集合中同名同岁的人,并输出他们的姓名。因为EQUALITY模式无法满足这个需求,所以定义了eval语句,使用STRICT模式下的equal方法实现判断。

总结

本文详细讲解了drools中Fact的Equality Modes,包括其种类和使用方法,并且给出了两个EQUALITY模式的示例。我们需要根据具体的需求选择合适的Equality Modes方式,以保证规则的正确执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅析drools中Fact的equality modes - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • day01-项目介绍&功能实现

    项目介绍&功能实现 1.项目介绍&环境搭建 一个以社交平台为核心的轻电商项目,功能如下: 短信登录、商户查询缓存、优惠券秒杀、达人探店、好友关注、附近的商户、用户签到、UV统计 1.1项目架构 1.2项目环境搭建 1.2.1后端项目搭建 mysql的版本采用5.7及以上版本 (1)首先创建数据库,需要创建的表有: tb_user:用户表 tb…

    Java 2023年4月19日
    00
  • springboot+spring data jpa实现新增及批量新增方式

    下面是关于springboot+spring data jpa实现新增及批量新增方式的完整攻略,希望能对您有所帮助。 1. 准备工作 在开始之前,我们需要确保使用的开发环境已经具备以下条件: JDK 8 或以上 Maven 3.2 或以上 IDE:Eclipse 或 IntelliJ IDEA 2. 创建Spring Boot 项目 首先,我们需要创建一个新…

    Java 2023年5月20日
    00
  • 一文详解Spring security框架的使用

    一文详解Spring Security框架的使用 简介 Spring Security是一个基于Spring框架的安全性管理框架,可以实现对Java Web应用程序进行完整的安全性管理。它提供了许多功能,例如认证,授权等,同时提供了广泛的API和扩展点,可以轻松地与其他框架和库集成。本文将详细介绍Spring Security框架的使用方法。 环境准备 在开…

    Java 2023年6月3日
    00
  • SpringBoot中打war包需要注意事项

    SpringBoot中打war包需要注意的事项 SpringBoot默认情况下是以jar包形式运行的,如果需要将SpringBoot项目部署到Web容器中,就需要将项目打成war包。下面是几个需要注意的事项: (1)修改项目的打包方式 在pom.xml文件中,将项目打包方式设置为war,并且去掉spring-boot-starter-web依赖的scope,…

    Java 2023年5月20日
    00
  • 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    如果在启动Tomcat时出现“错误: 代理抛出异常: java.rmi.server.ExportException: Port already in use: 1099”的错误,意味着端口1099已经被占用了。一般是因为其他应用程序或Tomcat已经在使用该端口,导致Tomcat无法使用。 解决该问题的方法有两种,一种是找到占用了端口1099的应用程序并关…

    Java 2023年5月27日
    00
  • Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解

    下面是关于“Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解”的完整攻略。 前言 在Java程序中,我们有时会需要将一个文件夹以及其中的文件打包成ZIP格式的压缩文件并下载。本文将介绍如何实现这个功能。 代码实现 Java提供了ZipOutputStream类和ZipEntry类,可以轻松地打包一个文件夹中的所有文件并生成ZIP文件。我们可以使…

    Java 2023年5月19日
    00
  • Java Lambda表达式常用的函数式接口

    Java Lambda表达式是函数式编程的核心特性之一,其中,函数式接口是Lambda表达式的基础。函数式接口是指仅包含一个抽象方法的接口,用来表示函数的签名。Java中已经预定义了很多常用的函数式接口,包括Consumer、Supplier、Function、Predicate等。下面我们逐一来介绍这些函数式接口,并提供几个示例说明。 Consumer C…

    Java 2023年5月26日
    00
  • POI通用导出Excel(.xls,.xlsx)的方法

    当我们需要将数据导出为Excel文件时,利用Apache POI这个强大的Java API可以快速简便地完成。以下是POI通用导出Excel(.xls,.xlsx)的方法攻略。 引入依赖 首先需要在Maven中引入POI的依赖: <dependency> <groupId>org.apache.poi</groupId> …

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部