概述
文章目录
- 前言
- 一、aviator是什么?
- 二、入门和安装
- 1.引入依赖
- 2.第一个示例
- 3.使用说明
- 二、进阶使用
- 1.算术运算表达式
- 2.逻辑表达式
- 3.官方函数
- 4.自定义函数
前言
你的业务项目是否有很多规则需要判断?规则是否经常变动?如果全部用代码开发是不是每次变动都需开发人员改动代码逻辑,重新编译、部署上线?是不是觉得非常繁琐麻烦?
本文推荐使用aviator规则引擎来处理此类场景的问题,做到规则可动态配置、自定义函数、无需打包重启程序。
本文主要讲解aviator的基本使用以及他的各种函数如何调用
一、aviator是什么?
AviatorScript 起源于 2010 年左右,由国内个人开发者Dennis开源的java轻量化规则引擎。官方文档地址
能处理运算表达式、逻辑判断表达式、可以使用if/elsif/else 条件语句、可以自定义函数…
二、入门和安装
1.引入依赖
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>{version}</version>
</dependency>
version 版本可以在 maven 找到,本指南编写的版本面向 5.0.0 及以上版本
2.第一个示例
// Compile a script
Expression script = AviatorEvaluator.getInstance().compile("println('Hello, AviatorScript!');");
script.execute();
3.使用说明
Aviator支持两种方式执行表达式,
1)直接使用字符串,把需要执行的表达式用字符串拼接的方法搞定之后直接丢给Aviator,返回值就是运行结果。
2)使用Aviator的脚本文件 .av,语法规则类似于js,可在其中写很多复杂的逻辑判断,调用时候指定文件路径即可。
本人项目使用的是第一种方法,因为规则都是系统上线之后用户自定义配置的,无法提前写好脚本,只能通过字符串拼接的方法执行
二、进阶使用
1.算术运算表达式
整数例如 -99、0、1、2、100……等等,Aviator中并没有 byte/short/int 等类型,统一整数类型都为 long
数字除了整数之外,Aviator同样支持浮点数,但是仅支持 double 类型,也就是双精度 64 位
可以直接使用 **+ - * / ** 符号进行算术运算,例如:
let a = 99;
let b = 0xFF;
let c = -99;
println(a + b);
println(a / b);
println(a- b + c);
println(a + b * c);
println(a- (b - c));
println(a/b * b + a % b);
2.逻辑表达式
本人项目中重点使用的功能,
应用场景举例:当病人性别为男性时候,诊断码不可为妇科疾病
这时候结果就是 true或false ,当表达式结果为false时即为异常需要记录错误信息
基础的逻辑运算符:
● > 大于
● >= 大于等于
● < 小于
● <= 小于等于
● == 等于
● != 不等于
输入:
println("3 > 1 is " + (3 > 1));
println("3 >= 1 is " + (3 >= 1));
println("3 >= 3 is " + (3 >= 3));
println("3 < 1 is " + (3 < 1));
println("3 <= 1 is " + (3 <= 1));
println("3 <= 3 is " + (3 <= 3));
println("3 == 1 is " + (3 == 1));
println("3 != 1 is " + (3 != 1));
输出
3 > 1 is true
3 >= 1 is true
3 >= 3 is true
3 < 1 is false
3 <= 1 is false
3 <= 3 is true
3 == 1 is false
3 != 1 is true
3.官方函数
Aviator官方提供了一些函数,可以做复杂逻辑判断
例如:
1) count(seq) 返回集合大小,seq 可以是数组,字符串,range ,List 等等
2) string.length(s) 求字符串长度,返回 Long
3) math.round(d) 四舍五入
…
本人项目因需结合页面做动态配置所以没有使用官方函数,都是自定义的
4.自定义函数
当官方函数不满足的情况下,可以自定义函数(非常好用!!!)
自定义函数有好几种方法,本文主要讲解其中两种
1)创建类基础AbstractFunction,例如:
public class TestAviator {
public static void main(String[] args) {
//注册函数
AviatorEvaluator.addFunction(new AddFunction());
System.out.println(AviatorEvaluator.execute("add(1, 2)"));
// 3.0
System.out.println(AviatorEvaluator.execute("add(add(1, 2), 100)")); // 103.0
}
}
class AddFunction extends AbstractFunction {
@Override
public AviatorObject call(Map<String, Object> env,
AviatorObject arg1, AviatorObject arg2) {
Number left = FunctionUtils.getNumberValue(arg1, env);
Number right = FunctionUtils.getNumberValue(arg2, env);
return new AviatorDouble(left.doubleValue() + right.doubleValue());
}
public String getName() {
return "add";
}
}
2、导入 java 方法,你可以把自己的函数全部写在一个工具类中快捷地导入 Java 类方法,例如:
AviatorEvaluator.addStaticFunctions("str", StringUtils.class);
其中的 StringUtils 就是你自己的工具类,注意本方法导入的只能是静态方法
最后
以上就是热情自行车为你收集整理的Aviator规则引擎保姆级教程前言一、aviator是什么?二、入门和安装二、进阶使用的全部内容,希望文章能够帮你解决Aviator规则引擎保姆级教程前言一、aviator是什么?二、入门和安装二、进阶使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复