设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 软件追踪 查看内容

表达式引擎Aviator发布4.0.0,支持lambda和多实例等

2018-6-26 21:54| 发布者: joejoe0332| 查看: 414| 评论: 0|原作者: oschina|来自: oschina

摘要: Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。可被用于动态的公式计算、规则执行和过滤等场景。本次发布是一个大版本升级,主要改进如下:多行表达式支持,以分号;隔开的 ...

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))");

    filtermap等高阶函数也支持使用 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跟踪运行,支持函数调用跟踪。

  • 语法错误信息改进,标记错误的表达式位置。

兼容性问题

  • 如果现有自定义函数名是 lambda,将无法正常使用,请使用其他名字。

更多信息请参考主页


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部