Bot releases are hidden (Show)
Published by killme2008 almost 6 years ago
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 贡献。性能测试来看有接近一倍的提升。long
和 double
函数不支持 decimal 和 bigint 类型。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>
Published by killme2008 over 6 years ago
本次发布是一个大版本升级,主要改进如下:
;
隔开的多个表达式,求值结果将是最后一个表达式的值。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))");
新增两个选项
ENABLE_PROPERTY_SYNTAX_SUGAR
,是否启用属性访问的语法糖,例如 a.b.c
的变量访问是否走 commons-beanutils 反射访问,默认启用为 true
。禁用后,这类变量将直接从 env 获取。NIL_WHEN_PROPERTY_NOT_FOUND
,当启用属性语法糖的时候,如果调用反射失败,默认行为是抛出异常,通过启用这个选项,将直接返回 null,忽略异常。支持求值器多实例,可以通过 AviatorEvaluator.newInstance()
创建求值器实例 AviatorEvaluatorInstance
,不同求值器之间的选项、自定义函数等不共享。原有的 AviatorEvaluator
只是一个全局静态实例。
修复字符串类型转义符支持。
新增 FunctionLoader
接口用于自定义函数加载
public interface FunctionLoader {
public AviatorFunction onFunctionNotFound(String name);
}
可以添加自定义函数加载器到求值器实例 AviatorEvaluator.addFunctionLoader(loader)
。默认新增提供了一个 SringContextFunctionLoader
,可用于从 spring 容器加载自定义函数。
seq.filter
函数现在支持 Map 类型集合的迭代过滤。seq
的谓词函数都支持第三个参数,用于做属性过滤,参见测试用例。#__env__
表示运行环境的 env 上下文。#__instance__
表示当前运行的求值器 AviatorEvaluatorInstance
实例。boolean(v)
,可将其他类型的值转成布尔类型,除了 nil/false之外,其他值都将为 true。Opitons.TRACE_EVAL
跟踪运行,支持函数调用跟踪。Published by killme2008 almost 7 years ago
主要特性:
Options.TRACE_EVAL
,打开后可跟踪调试求值过程,该选项极大地影响性能,并且将关闭逻辑运算符的短路运算,请不要在生产环境打开。Options.PUT_CAPTURING_GROUPS_INTO_ENV
,是否将正则匹配捕获的分组放入 env
,默认打开。可关闭提升正则匹配性能。ALWAYS_USE_DOUBLE_AS_DECIMAL
,这是个命名错误,请使用新选项 ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL
替代。<!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.3.0</version>
</dependency>
Published by killme2008 almost 7 years ago
主要变更:
aviator.preferClassloaderDefiner
,默认为 false
,表示是否继续使用 ClassLoader#defineClass
的方式来定义表达式类,默认将优先使用 sun.misc.Unsafe#defineAnonymousClass
方法。sun.misc.Unsafe#defineAnonymousClass
,编译性能更好(没有 ClassLoader 加载校验等环节),表达式编译后的匿名类将可以被 GC 正常回收,解决在编译大量动态表达式的时候导致的内存消耗膨胀问题。<!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.2.0</version>
</dependency>
Published by killme2008 almost 7 years ago
Options.TRACE
。整个库不包括依赖库大小缩减到 289 K。Published by killme2008 over 7 years ago
主要更新如下
seq.every
、seq.not_any
和 seq.some
,以及逻辑组合函数,用于返回复合谓词,例如 seq.and(seq.gt(3), seq.lt(10))
等, 例如://检测数组每个元素都在 0 <= e < 10 之间。
AviatorEvaluator.execute("seq.every(a,seq.and(seq.ge(0), seq.lt(10)))", env);
see #18
Expression#getVariableFullNames
,用于返回表达式原始的变量名列表, see #21#a.b[0].c
,变量名要求以 #
开始, see #19Maven 使用:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.1.0</version>
</dependency>
或下载二进制文件。
Published by killme2008 almost 8 years ago
主要变更:
Published by killme2008 almost 8 years ago
改进如下:
public abstract AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args);
math.round
等同于 Math.round 方法,以及 rand(n)
用于产生一个 [0-n) 之间的整数。rand
函数实现,更安全和高效。AviatorObject
增加 boolean isNull(Map<String, Object> env)
用于判断运行时值是否为 null。Published by killme2008 almost 8 years ago
Published by killme2008 about 8 years ago
Published by killme2008 about 8 years ago
Published by killme2008 about 8 years ago
Options
枚举类型,增加方法 AviatorEvaluator.setOption
用于设置各种选项:AviatorEvaluator.setOption(Options.TRACE, true);
AviatorEvaluator.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.COMPILE);
ALWAYS_USE_DOUBLE_AS_DECIMAL
,如果设置为 true,那么所有表达式中的浮点数 literal 都将解析为 BigDecimal。用户自行传入的变量仍然需要自行保证。Published by killme2008 about 10 years ago
AviatorEvaluator.execute(expr, env)
方法将不缓存 Expression。Maven 引用:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>2.3.3</version>
</dependency>