我是靠谱客的博主 热情自行车,最近开发中收集的这篇文章主要介绍Aviator规则引擎保姆级教程前言一、aviator是什么?二、入门和安装二、进阶使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 前言
  • 一、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是什么?二、入门和安装二、进阶使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部