内容简介: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))");
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
跟踪运行,支持函数调用跟踪。语法错误信息改进,标记错误的表达式位置。
兼容性问题
如果现有自定义函数名是 lambda,将无法正常使用,请使用其他名字。
更多信息请参考主页。
【声明】文章转载自:开源中国社区 [http://www.oschina.net]
以上所述就是小编给大家介绍的《表达式引擎 Aviator 发布 4.0.0,支持 lambda 和多实例等》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 用实例分析正则表达式设计过程
- 正则表达式匹配(URL、电话、手机、邮箱)的实例代码
- Linux 三剑客之 awk(一):awk 简介与表达式实例
- CSharpFlink 实时计算引擎,增加一个窗口或表达式计算任务支持多个算子实例
- 正则表达式 – 如何使用正则表达式进行Erlang模式匹配?
- lambda表达式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MD5 加密
MD5 加密工具
HEX CMYK 转换工具
HEX CMYK 互转工具