深入浅析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日

相关文章

  • html css将表头固定的最直接的方法

    要将表头固定,最直接的方法是使用CSS中的position属性和z-index属性。具体步骤如下: HTML结构 首先,我们需要在HTML结构中将表格分为两部分:表头和表体。表头使用 标签,表体使用 标签。代码示例如下: <table> <thead> <tr> <th>姓名</th> <th…

    Java 2023年6月15日
    00
  • SpringBoot自定义starter实例代码

    SpringBoot自定义starter实例代码 在SpringBoot中,我们可以使用自定义starter来封装一些常用的功能,以便于在多个项目中复用。本文将详细讲解SpringBoot自定义starter实例代码的完整攻略,并提供两个示例。 1. 创建自定义starter 以下是创建自定义starter的基本流程: 创建一个Maven项目,并添加以下依赖…

    Java 2023年5月15日
    00
  • 经常使用的JDBC连接数据库方式

    JDBC是一种连接数据库的通用方式。在Java语言中,通过使用JDBC API,可以连接各种类型的关系型数据库,如MySQL、Oracle、PostgreSQL等。下面我们来详细讲解一下经常使用的JDBC连接数据库方式的完整攻略。 步骤一:加载驱动程序 在使用JDBC连接数据库之前,我们需要先加载相应的数据库驱动程序。常见的数据库驱动程序有mysql-con…

    Java 2023年5月20日
    00
  • JAVA生产者消费者(线程同步)代码学习示例

    JAVA生产者消费者(线程同步)代码学习示例 什么是生产者消费者模型 生产者消费者模型是一种常用的线程同步模型,它通过在多个线程之间协调共享资源的访问,来提高系统的效率和可靠性。在生产者消费者模型中,生产者线程负责生成数据,消费者线程负责消费数据,两者通过共享队列来协作,实现生产与消费的同步和协调。 学习示例1:基本实现 假设有一个生产者线程和一个消费者线程…

    Java 2023年5月26日
    00
  • Java版水果管理系统源码

    Java版水果管理系统源码攻略 系统介绍 Java版水果管理系统源码是一款基于Java语言开发的水果供应管理系统,主要用于管理水果供应链上的各个环节,包括水果添加、修改、删除、查看等功能,同时还支持销售管理、库存管理、供应商管理等功能,满足了水果供应管理中的各种需求。该系统使用MVC设计模式,采用Java Swing作为前端界面开发框架,使用MySQL数据库…

    Java 2023年5月24日
    00
  • java面试常见问题之Hibernate总结

    我来详细讲解“Java面试常见问题之Hibernate总结”的完整攻略。 简介 Hibernate是Java平台上的一个ORM框架,它提供了高效、灵活的对象/关系映射解决方案,能够很好地解决Java应用程序中对象持久化的问题。由于Hibernate的应用非常广泛,因此,在Java的面试中也经常会被问及Hibernate相关的问题。 Hibernate常见问题…

    Java 2023年5月20日
    00
  • Java Properties作为集合三个方法详解

    当我们使用Java进行编程时,经常需要使用配置文件来存储一些关键的配置信息,于是Java提供了一个名为Properties的类来处理这个问题。Properties是一个Map集合,其中的key和value都必须是字符串类型。下面将详细讲解Java Properties作为集合的三个常用方法:getProperty、setProperty和load。 getP…

    Java 2023年6月15日
    00
  • Springmvc Controller接口代码示例

    下面是“Springmvc Controller接口代码示例”的完整攻略。 一、准备工作在开始编写示例代码之前,需要先进行一些准备工作: 确认已经安装好了Java开发环境(包括JDK和IDE)。 创建一个Springmvc项目,包括pom.xml和Web.xml两个配置文件。 配置Springmvc的注解驱动和视图解析器等相关的配置信息。 二、编写Contr…

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