Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。可被用于动态的公式计算、规则执行和过滤等场景。 本次发布是一个大版本升级,主要改进如下: 多行表达式支持,以分号; 隔开的多个表达式,求值结果将是最后一个表达式的值。 支持 lambda 定义匿名函数,支持闭包捕获。自定义函数可以通过 lambda,举例如下 AviatorEvaluator.defineFunction("s",
"lambda(x) -> lambda(y) -> lambda(z) -> x + y + z end end end");
AviatorEvaluator.exec("println(s(4)(5)(6))"); filter 、map 等高阶函数也支持使用 lambda 替代原有的谓词函数:
Map<String, Object> env = ...
int [] a = ...
env.put("a", a);
AviatorEvaluator.execute("map(a, lambda(x) -> x + 1 end))"); 新增两个选项 支持求值器多实例,可以通过 AviatorEvaluator.newInstance() 创建求值器实例 AviatorEvaluatorInstance ,不同求值器之间的选项、自定义函数等不共享。原有的 AviatorEvaluator 只是一个全局静态实例。 修复字符串类型转义符支持。 新增 FunctionLoader 接口用于自定义函数加载 public interface FunctionLoader {
public AviatorFunction onFunctionNotFound(String name);
} 可以添加自定义函数加载器到求值器实例 AviatorEvaluator.addFunctionLoader(loader) 。默认新增提供了一个 SringContextFunctionLoader ,可用于从 spring 容器加载自定义函数。 seq.filter 函数现在支持 Map 类型集合的迭代过滤。
seq 的谓词函数都支持第三个参数,用于做属性过滤,参见测试用例。
新增两个内置的特殊变量: 新增函数 boolean(v) ,可将其他类型的值转成布尔类型,除了 nil/false之外,其他值都将为 true。 Opitons.TRACE_EVAL 跟踪运行,支持函数调用跟踪。
语法错误信息改进,标记错误的表达式位置。
兼容性问题更多信息请参考主页。 |