@killme2008 killme2008 released this Jan 2, 2019 · 16 commits to master since this release

Assets 3

新功能列表

  1. 支持赋值语句,可以在表达式中给变量赋值,一些例子:
    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 成员使用。

  1. AviatorEvaulatorInstanceAviatorEvaulator 新增方法 isExpressionCached()getExpressionCacheSize() 分别用于判断表达式是否缓存编译结果,以及返回缓存的编译表达式总数。
  2. AbstractFunctionAbstractVariadicFunction 都继承了 AviatorObject,函数作为 first class 成员提供,他们的值就是自身。
  3. 新增可变参数函数 tuple(x, y, z, ...) 用于返回一个 Object [] 数组,适用于需要返回多参数的场景。
  4. 对于 a.b.c 的嵌套访问语法糖做了性能改进,如果 ab 都是 Map,将直接访问,避免全局锁和反射,感谢阿里同事的 idea 贡献。性能测试来看有接近一倍的提升。
  5. 一些代码重构和改进,感谢 @einverne

Bug 修复

  1. #77 开启高精度计算情况下,正则表达式错误。
  2. #87 longdouble 函数不支持 decimal 和 bigint 类型。
  3. #92 转义符号处理异常。
  4. 修复编译优化丢失 env 的 bug。

兼容问题

  1. FunctionUtils#getStringValue(AviatorObject, Map) 当 string 为 null 的时候直接返回,不再抛出异常 #67
  2. 4.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>