google aviator表达式求值引擎

  • A+
所属分类:英语学习

Aviator是一个高机能、轻量级的 java 言语实行的表达式求值引擎, 重要用于各样表达式的动态求值。现正在仍然有良多开源可用的 java 表达式求值引擎,为什么还需求 Avaitor 呢?

Aviator的打算目的是轻量级和高机能,比拟于Groovy、JRuby的笨重, Aviator相当幼, 加上依赖包也才450K,不算依赖包的线K; 当然, Aviator的语法是受限的, 它不是一门完善的言语, 而只是言语的一幼个人会集。

其次, Aviator的实行思绪与其他轻量级的求值器很不雷同, 其他求值器平常都是通过疏解的体例运转, 而Aviator则是直接将表达式编译成Java 字节码, 交给JVM去践诺。简便来说, Aviator的定位是介于Groovy如许的重量级剧本言语和IKExpression如许的轻量级表达式引擎 之间。

Aviator增援大个人运算操作符, 包罗算术操作符、干系运算符、逻辑操作符、位运算符、正则完婚操作符(=~)、三元表达式(?:), 而且增援操作符的优先级和括号强造优先级, 的确请看后面的操作符列表, 增援自界说函数.

仔细的朋侪信任防卫到结果是Long,而不是Integer。这是由于Aviator的数值类型仅增援Long和Double, 任何整数都将转换成Long, 任何浮点数都将转换为Double, 包罗用户传入的变量数值。这个例子的打印结果将是准确谜底6。

上面的例子演示了何如向表达式传入变量值, 表达式中的yourName是一个变量, 默以为null, 通过传入MapString,Object的变量绑定境况, 将yourName修设为你输入的名称。env的key是变量名,value是变量的值。

上面例子中的hello是一个Aviator的String,Aviator的String是任何用单引号或者双引号括起来的字符序列,String可能对比巨细(基于unicode顺次), 可能参预正则完婚, 可能与任何对象相加, 任何对象与String相加结果为String。String中也可能有转义字符,如\n、\\、\等。

Aviator 2.2 出手新增多一个exec要领, 可能更轻易地传入变量并践诺, 而不需求构造env这个map了:

只须正在exec中遵守变量正在表达式中的显示顺次传入变量值就可能践诺, 不需求构修Map了。

Aviator 增援函数移用, 函数移用的格调犹如 lua, 下面的例子获取字符串的长度:

上面提到的例子都是直接践诺表达式, 本相上 Aviator 背后都帮你做了编译并践诺的事务。 你可能自身先编译表达式, 返回一个编译的结果, 然后传入区此表env来复用编译结果, 升高机能, 这是更推选的操纵体例:

通过compile要领可能将表达式编译成Expression的中心对象, 当要践诺表达式的时辰传入env并移用Expression的execute要领即可。 表达式中操纵了括号来强造优先级, 这个例子还操纵了用于对比数值巨细, 对比运算符!=、==、、=、、=不但可能用于数值, 也可能用于String、Pattern、Boolean等等, 乃至是任何用户传入的两个都实行了接口的对象之间。

编译后的结果你可能自身缓存, 也可能交给 Aviator 帮你缓存,AviatorEvaluator内部有一个全部的缓存池, 假设你决计缓存编译结果, 可能通过:

将cached修设为true即可, 那么下次编译统一个表达式的时辰将直接返回上一次编译的结果。

Aviator 不供给if else语句, 不过供给了三元操作符?:用于要求决断,操纵上与 java 没有什么区别:

Aviator 的三元表达式关于两个分支的结果类型并不央求同等,可能是任何类型,这一点与 java 区别。

Aviator 增援类 Ruby 和 Perl 格调的表达式完婚运算,通过=~操作符, 如下面这个例子完婚 email 并提取用户名返回:

email与正则表达式/([\\w0-8]+@\\w+[\\.\\w+]+)/通过=~操作符来完婚,结果为一个Boolean类 型, 于是可能用于三元表达式决断,完婚告捷的时辰返回$1,指代正则表达式的分组 1,也便是用户名,不然返回unknown。

Aviator 正在表达式级别增援正则表达式,通过//括起来的字符序列组成一个正则表达式,正则表 达式可能用于完婚(行为=~的右操作数)、对比巨细,完婚仅能与字符串举行完婚。完婚告捷后, Aviator 会主动将完婚告捷的分组放入$num的变量中,此中$0指代所有完婚的字符串,而$1表现第一个分组,以此类推。

Aviator 有个轻易用户操纵变量的语法糖, 当你要访谒变量a中的某个属性b, 那么你可能通过a.b访谒到, 更进一步,a.b.c将访谒变量a的b属性中的c属性值, 执行开来也便是说 Aviator 可能将变量声明为嵌套访谒的体式。

Aviator 并不增援日期类型,假设要对比日期,你需求将日期写字符串的体式,而且央求是形如 “yyyy-MM-dd HH:mm:ss:SS”的字符串,不然都将报错。 字符串跟java.util.Date对比的时辰将主动转换为Date对象举行对比:

big int和decimal的运算,跟其他数字类型long,double没有什么区别,操作符依然是一律的。 aviator重载了基础算术操作符来增援这两种新类型:

aviator 具有壮健的操作会集和数组的seq库。所有库格调犹如函数式编程中的高阶函数。正在 aviator 中, 数组以及java.util.Collection下的子类都称为seq,可能直接愚弄seq库举行遍历、过滤和齐集等操作。

从 2.1.1.版本出手,Aviator批准修设输出每个表达式天生的字节码,只须修设trace为true即可:

此中big int和decimal是 2.3.0 版本出手引入的。数字还增援十六进造(以0x或者0X开始的数字), 以及科学计数法,如1e-3等。 不增援其他进造。

Aviator 增援常见的算术运算符,包罗+ - * / %五个二元运算符,和一元运算符-(负)。此中- * / %和一元的-仅能感化于Number类型。

+不但能用于Number类型,还可能用于String的相加,或者字符串与其他对象的相加。

Avaitor 的增援的逻辑运算符包罗,一元否认运算符!,以及逻辑与的&&,逻辑或的。逻辑运算符的操作数只可为Boolean。

干系运算符可能感化于Number之间、String之间、Pattern之间、Boolean之间、变量之间以及其他类型与nil之间的干系对比, 区别类型除了nil以表不行互比拟较。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin