Aviator
Aviator是一个高性能、轻量级的java语言实现的表达式引擎,它动态地将表达式编译成字节码并运行,Aviator非常小,Aviator直接将表达式编译成JVM字节码,交给JVM运行。
特性
- 支持绝大多数运算操作符,包括算术操作符,关系运算符,逻辑操作符,位运算符,正则匹配操作符(=~),三元表达式
- 支持操作符优先级和括号强制设定优先级
- 逻辑运算符支持短路运算
- 支持丰富类型,例如nil,整数和浮点数,字符串,正则表达式,日期,变量等, 支持自动类型转换
- 内置一套强大的常用函数库
- 可自定义函数,易于扩展
- 可重载操作符
- 支持大数运算(BigDecimal)和高精度运算(BigDecimal)
- 性能优秀
Maven
1 | <dependency> |
常用方法
1 |
|
自定义函数
1 |
|
利用自定义函数可以各种强大的逻辑
编译表达式
上面的例子大都是Aviator做了编译并执行的工作,其实可以先编译表达式,返回一个编译的结果,在传入不同的env来复用编译结果,提高性能,推荐使用这一种方式1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void cacheCompiledTest(){
String expression = "a - (b - c) > 200";
// 编译表达式
// Expression compiledExp = AviatorEvaluator.compile(expression);
Expression compiledExp = AviatorEvaluator.compile(expression, true);
Map<String, Object> env = new HashMap<>();
env.put("a", 200);
env.put("b", 300);
env.put("c", 400);
// 执行表达式
Boolean result = (Boolean)compiledExp.execute(env);
System.out.println(result);
}
可以通过1
Expression compiledExp = AviatorEvaluator.compile(expression, true);
将cached设置为true,下次编译同一个表达式的时候直接将返回上一次编译的结果
常用的内置函数
- 求长度:count(list)
- 求和:reduce(list, + , 0),reduce函数接受三个参数,1) seq,2)聚合函数,3) 初始值
- 过滤:filter(list, seq.gt(9)),过滤出list中所有大于9的元素并返回集合
- 判断元素在不在集合里:include(list, 10)
- 排序:sort(list)
- 遍历整个集合: map(list, println),map接收的第二个函数将作用于集合中的每个元素
其他设置
两种运行模式
默认AviatorEvaluator以执行速度有限:
1
AviatorEvaluator.setOptimize(AviatorEvaluator.EVAL);
修改为编译速度有限,这样不会做编译优化
1
AviatorEvaluator.setOptimize(AviatorEvaluator.COMPILE);