Aviator 4.1.0 发布
killme2008
released this
02 Jan 03:02
·
650 commits
to master
since this release
新功能列表
- 支持赋值语句,可以在表达式中给变量赋值,一些例子:
assertEquals(3, AviatorEvaluator.execute("a=1; a+2"));
assertEquals(5, AviatorEvaluator.execute("a=3; b=2; a+b"));
assertEquals(20.0, AviatorEvaluator.execute("a=3; b=2; c=a+b; c*4.0"));
assertEquals(6, AviatorEvaluator.execute("square = lambda(x) -> x *2 end; square(3)"));
assertEquals(1, AviatorEvaluator.execute("a=5;b=4.2 ; c= a > b? 1: 0; c"));
assertEquals(6, AviatorEvaluator.execute("add_n = lambda(x) -> lambda(y) -> x + y end end ; "
+ "add_1 = add_n(1) ; " + "add_2 = add_n(2) ;" + " add_1(add_2(3))"));
可以看到处了基本类型赋值之外,还可以支持将 lambda 表达式赋值给一个变量,函数也将作为 first class 成员使用。
AviatorEvaulatorInstance
和AviatorEvaulator
新增方法isExpressionCached()
和getExpressionCacheSize()
分别用于判断表达式是否缓存编译结果,以及返回缓存的编译表达式总数。AbstractFunction
和AbstractVariadicFunction
都继承了AviatorObject
,函数作为 first class 成员提供,他们的值就是自身。- 新增可变参数函数
tuple(x, y, z, ...)
用于返回一个Object []
数组,适用于需要返回多参数的场景。 - 对于
a.b.c
的嵌套访问语法糖做了性能改进,如果a
和b
都是Map
,将直接访问,避免全局锁和反射,感谢阿里同事的 idea 贡献。性能测试来看有接近一倍的提升。 - 一些代码重构和改进,感谢 @einverne
Bug 修复
- #77 开启高精度计算情况下,正则表达式错误。
- #87
long
和double
函数不支持 decimal 和 bigint 类型。 - #92 转义符号处理异常。
- 修复编译优化丢失 env 的 bug。
兼容问题
FunctionUtils#getStringValue(AviatorObject, Map)
当 string 为 null 的时候直接返回,不再抛出异常 #674.0.0-RC
版本为了支持 lambda 闭包,引入了嵌套 scope 的概念,并且不再直接修改用户传入的 env map,但是发现很多用户依赖这个修改行为,因此 4.1.0 引入了Options.USE_USER_ENV_AS_TOP_ENV_DIRECTLY
选项,默认为 true,表示将直接使用用户的 env 作为 top 级别的 env 使用,兼容老版本的行为 #74 #94
推荐跳过此版本,直接升级到最新版本,此版本有一定性能问题
Maven 依赖:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>4.1.0</version>
</dependency>