背景
用户希望通过一些自定义一些表达式,灵活的对数据进行过滤
为什么选择 Aaviator
我们调研了业界主流的一些规则引擎以及表达式引擎,如 Drools、EasyRule、JEXL、Aviator、qlExpress 等。从复杂度、与我们目前需求的契合程度、扩展性、性能、社区活跃度、文档、资料的完善程度以及使用者的学习成本等多方面考虑,决定采用 Aviator 来作为 filter_express 解析引擎 。 Aviator创建之初就是为了高性能、轻量级,并且支持自定函数以及各种定制选项,拥有各种内置函数且扩展较好,足够简单,用户的学习成本足够低,并且可以完美解决这个的问题。
Aaviator 基本使用
1.添加依赖
代码语言:javascript复制 <dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.3.0</version>
</dependency>
代码语言:javascript复制public class TestAviator {
public static void main(String[] args) {
System.out.println(AviatorEvaluator.execute("1 2"));
System.out.println(AviatorEvaluator.execute("1 2==3"));
System.out.println(AviatorEvaluator.execute("1 2>3"));
}
}
Aaviator 高级特性-自定义函数
我们要自定义个 add 函数,希望 add(1,2) 等价于 1 2
代码语言:javascript复制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.intValue() right.intValue());
}
public String getName() {
return "add";
}
}
测试
代码语言:javascript复制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("bigint(add(add(1, 2), 100))")); // 103.0
}
}
官网
https://www.yuque.com/boyan-avfmj/aviatorscript