Drools规则基础语法及操作示例

Drools基础操作符示例

为了防止忘记怎么写规则,这里写个操作符使用示例,以后直接查找。

Drools规则引擎中,标准规则文件是以 .drl 结尾的,可用记事本工具进行查看和编辑

基础maven依赖及项目结构配置见入门示例文档:Drools规则引擎使用入门


常规计算操作符

Drools自带内置操作符



基础项目结构,及kmodle.xml配置如图, 详见 Drools规则引擎使用入门

基本结构,详情见入门教程




(一)常规计算操作符


可以使用常规计算操作符:+ - * / %(加减乘除、取模 )

也可以使用条件连接符:

&& 表示且的关系

||表示或的关系

一个单逗号表示也是且的关系

除此之外还有 > < >= <= == !=

准备2个实体类PersonOrder

package com.pojo;

import lombok.Data;

@Data
public class Order {

    private Person person;
    private int price;
}

package com.pojo;

import lombok.Data;

@Data
public class Person {

    private int age;
    private String name;
}



下面是基本操作符的使用示例

package rules.collect
import  com.pojo.Person
import  com.pojo.Order

rule "drools_1_test"
    // when和then之间是判断条件,这一部分被称为 LHS 部分
    when
        /**
         *  关系符号: > < >=  <= != ==  都可以用
         *  操作符号: + - * / % || , &&   都可以用
         */
        $user:Person($age:age == 30,$age != 2 || (age >= 50))
        $order:Order(person == $user,(price / 2) > 5 || (price % 3) > 1)
        Order($order.price - 1 > 10 ,price + 1 > 15 || price - 1 > 1000)
    then
        $user.setName("处理完毕");
        update($user);
        System.out.println();
        System.out.println("Person打印:"+$user);
        System.out.println("Order 打印:"+$order);
end

在这里插入图片描述






(二)Drools自带内置操作符

Drools自带操作符

contains, not contains

memberOf ,not memberOf

matches, not matches

List、Set、Map集合元素判断


准备实体类

@Data
public class School {
    private String schoolName;
    private List<String> classNames;
    private Map<String,Integer> map;
    private String[] array;
    private Set<String> sets;
}

测试类代码

public static void main(String[] args) {

        School school = new School();
        school.setSchoolName("阳光灿烂的小学");
        school.setArray(new String[]{"小红", "小李", "小黄"});
        school.setClassNames(Arrays.asList("一班", "二班", "三班", "四班"));

        Set<String> sets = new HashSet<>();
        sets.add("小黑");
        sets.add("小白");
        school.setSets(sets);

        Map<String, Integer> map = new HashMap<>();
        map.put("一班", 33);
        map.put("二班", 50);
        map.put("三班", 28);
        map.put("四班", 43);
        school.setMap(map);

        KieServices factory = KieServices.Factory.get();
        KieContainer container = factory.getKieClasspathContainer();
        KieSession session = container.newKieSession("rule_test1_session");

        session.insert(school);
        int count = session.fireAllRules();
        System.out.println("总共执行了条" + count + "规则");
        session.dispose();

    }

各个内置操作符及关键字的使用示例

package rules.collect
import  com.pojo.School

rule "drools_3_test"
    when
        // contains关键字在 字符串 集合 数组中的使用
        $school:School()
        School($school.schoolName contains "阳光")  // 字符串判断是否包含关键字
        School($school.getSchoolName() not contains "小黑")
        School($school.getClassNames() contains "一班")   //List判断是否包含关键字
        School($school.getArray() contains "小红")    // 数组判断是否包含关键字
        School($school.getMap() contains "二班")    // Map判断key,是否包含关键字

        // 字符串操作 判断 开头/结尾 长度
        School($school.schoolName str[startsWith] "阳光")
        School($school.schoolName str[endsWith] "小学")
        School($school.schoolName str[length] 7)

        // memberOf与not memberOf 关键字在 字符串 集合 数组中的使用
        School("阳光" memberOf $school.getSchoolName())// 关键字是否包含于字符串
        School("9班" not memberOf $school.getClassNames())//关键字是否不包含于字List
        School("小红" memberOf $school.getArray())// 字符串是否包含于数组
        School("二班" memberOf $school.getMap())// 字符串是否包含于Map

        // 正则表达式匹配
        School($school.schoolName matches "阳光.*")

        //获取集合中的元素
        School(classNames[2] == "三班") // 获取List中的元素,这中[] 的方式,只能在LHS中用
        School(map.get("一班") == 33) // 获取Map中的元素,这中map.get() 的方式,只能在LHS中用

    then
        System.out.println();
        System.out.println("School:"+$school);
        System.out.println("List所有元素值是:"+$school.getClassNames());
		// list的get的方式只能在RHS使用
        System.out.println("List第3个元素值是:"+$school.getClassNames().get(2));
		//Set获取方式只能在RHS使用
        System.out.println("Set第1个元素值是:"+$school.getSets().iterator().next());
		//这种$school.getMap().get("") 的方式,只能在RHS中用
        System.out.println("Map获取 \"一班\" 的元素值是:"+$school.getMap().get("一班"));
end
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值