Java - Aviator

Aviator

Aviator是一个高性能、轻量级的java语言实现的表达式引擎,它动态地将表达式编译成字节码并运行,Aviator非常小,Aviator直接将表达式编译成JVM字节码,交给JVM运行。

特性

  1. 支持绝大多数运算操作符,包括算术操作符,关系运算符,逻辑操作符,位运算符,正则匹配操作符(=~),三元表达式
  2. 支持操作符优先级和括号强制设定优先级
  3. 逻辑运算符支持短路运算
  4. 支持丰富类型,例如nil,整数和浮点数,字符串,正则表达式,日期,变量等, 支持自动类型转换
  5. 内置一套强大的常用函数库
  6. 可自定义函数,易于扩展
  7. 可重载操作符
  8. 支持大数运算(BigDecimal)和高精度运算(BigDecimal)
  9. 性能优秀

Maven

1
2
3
4
5
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.3.0</version>
</dependency>

常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void generalMethodTest(){

System.out.println(AviatorEvaluator.execute("1 + 2 + 3"));

String name = "jinzl";
Map<String, Object> params = new HashMap<>();
params.put("name", name);
System.out.println(AviatorEvaluator.execute("'Hello, ' + name", params));
// Aviator 2.2之后新增exec方法,可以方便的传入变量
System.out.println(AviatorEvaluator.exec("'Hello, ' + name", name));

params.put("a", 3);
params.put("b", 4);
System.out.println(AviatorEvaluator.execute("a + b / 3.0", params));

}

自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void customMethodTest(){
AviatorEvaluator.addFunction(new AddFunction());
System.out.println(AviatorEvaluator.execute("add(1, 2)"));
System.out.println(AviatorEvaluator.execute("add(add(1, 2), 100)"));
}

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());
}

@Override
public String getName() {
return "add";
}
}

利用自定义函数可以各种强大的逻辑

编译表达式

上面的例子大都是Aviator做了编译并执行的工作,其实可以先编译表达式,返回一个编译的结果,在传入不同的env来复用编译结果,提高性能,推荐使用这一种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
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);
评论