Drools基础操作符示例
为了防止忘记怎么写规则,这里写个操作符使用示例,以后直接查找。
Drools规则引擎中,标准规则文件是以 .drl
结尾的,可用记事本工具进行查看和编辑
基础maven依赖及项目结构配置见入门示例文档:Drools规则引擎使用入门
基础项目结构,及kmodle.xml配置如图, 详见 Drools规则引擎使用入门
(一)常规计算操作符
可以使用常规计算操作符:+
-
*
/
%
(加减乘除、取模 )
也可以使用条件连接符:
&&
表示且的关系
||
表示或的关系
,
一个单逗号表示也是且的关系
除此之外还有 >
<
>=
<=
==
!=
准备2个实体类
Person
、Order
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