文章目录

  • 前言
  • 一、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 就是你自己的工具类,注意本方法导入的只能是静态方法