名称 | 类型 | 备注 |
---|---|---|
AviatorScript | bool,long(byte\short\int都被转为long),double(float被转为double),bigint(BigInteger,字面量超过long表示范围或以N结尾即为bigint),decimal(BigDecimal,字面量以M结尾),string(单引号或双引号,支持插值"#{name}" ),正则(/^(.*)\.av$/ ),null(nil) |
多种类型参与运算优先级:long->bigint->decimal->double,任何类型和double计算都会是double,开启Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL选项可以将浮点数都解析为decimal;string不能使用Java类型的实例方法,需要通过string 内置函数操作如string.length(s) |
MVEL | BigInteger(以I结尾),BigDecimal(以B结尾),string(单引号或双引号),null(null或nil),其他同Java | |
OGNL | BigInteger(以H或h结尾),BigDecimal(以B或b结尾),string(单引号或双引号),其他同Java | |
SpEl | int/long/float/double/boolean,string(单引号或双引号),其他同Java | |
QLExpress | string(单引号或双引号),其他同Java | |
JEXL | BigInteger(以H或h结尾),BigDecimal(以B或b结尾),string(单引号或双引号,支持插值${name} ),其他同Java |
|
JUEL | 同Java。表达式用${} 包含 |
名称 | 操作符 | 备注 |
---|---|---|
AviatorScript | 幂运算(2**3 ),正则匹配("a.av" =~ /^(.*)\.av$/ ) |
通过 AviatorEvaluatorInstance.aliasOperator(OperatorType, String) 方法来设置别名,目前仅支持 AND和 OR操作。 通过 AviatorEvaluatorInstance#addOpFunction(OperatorType, AviatorFunction) 就可以自定义操作符的行为 |
MVEL | foo == empty foo满足任何空要求返回true;"123" == 123 右值强转为左值类型返回true;user.?manager.name 安全访问属性; parentNames = (parent.name in users) 投影类似stream map的作用; |
|
OGNL | headline.parent.(ensureLoaded(), name) 点处的对象将用作整个括号表达式中的当前对象;name in { null,"Untitled" } 判断是否为null或"Untitled" 对应的还有 not in ;users.{name} 投影类似stream map的作用;userNames.{? #this instanceof String} 选择类似stream filter的作用; |
|
SpEl | '5.00' matches '^-?\\d+(\\.\\d{2})?$' 正则匹配;name?:'Unknown' name为空时为'Unknown'; user.?manager.name 安全访问属性;users.![name] 投影类似stream map的作用;map.?[value<27] 选择类似stream filter的作用; |
|
QLExpress | 支持自定义操作符,添加操作符号,可以设置优先级 void addOperator(String name, Operator op); void addOperator(String name, String aRefOpername, Operator op); 替换操作符处理 OperatorBase replaceOperator(String name, OperatorBase op); 添加操作符和关键字的别名,比如 if..then..else -> 如果。。那么。。否则。。 void addOperatorWithAlias(String keyWordName, String realKeyWordName, String errorInfo); |
|
JEXL | user.?manager.name 安全访问属性;x ?? 'unknown or null x' x 为 null 或 undefined 时 'unknown or null x' ;"a" =~ ["a","b","c","d","e",f"] in 或 匹配 时返回true;"a" !~ ["a","b","c","d","e",f"] not in 或 不匹配时返回true;"abcdef" =^ "abc" "abc"开头;a !^ "abc" 不以"abc"开头;"abcdef" =^ "def" "def"开头;a !^ "def" 不以"def"开头 |
|
JUEL | ${!empty name} 判断name是否为空 |
名称 | 控制语句 | 备注 |
---|---|---|
AviatorScript | else if 写法:elsif ;for v in itr 类似 Javafor (v : itr) ;其他和Java类似 |
必须使用花括号 |
MVEL | until循环和while逻辑相反;for (v : 3) 遍历 1到3 ;其他和Java类似 |
|
OGNL | 不支持 | |
SpEl | 不支持 | |
QLExpress | 不支持for (v: list) |
|
JEXL | 和Java类似 | JexlScript支持 JexlExpression不支持,JEXL有些特性也是需要JexlScript才支持,但暂未找到详细说明 |
JUEL | 不支持 |
名称 | 集合 | 备注 |
---|---|---|
AviatorScript | tuple(定义固定数组, tuple(1, 2, 'hello') ),seq(数组:seq.array(int, 1, 2) ,第一个参数是Java类型;列表:seq.list(1, 2) ;集合:seq.set(1, 2) ;映射:seq.map('a', 1) ) |
|
MVEL | 映射:["a" : 1] 列表:[1, 2] 数组:{1, 2} |
|
OGNL | 映射:#{"a" : 1} 列表:{1, 2} 数组:new int[]{1, 2} |
|
SpEl | 映射:{"a" : 1} 列表:{1, 2} 数组:new int[]{1, 2} |
|
QLExpress | 映射: NewMap("a" : 1) 列表:NewList(1, 2) 数组:[1, 2] |
|
JEXL | 映射:{"a" : 1} 列表:[1, 2...] 数组:[1, 2] 集合:{1, 2} |
|
JUEL | 无特殊语法 |
名称 | 函数 | 备注 |
---|---|---|
AviatorScript | 函数:fn add(x, y) { return x + y;} lambda函数:lambda (x, y) -> x + y end |
支持参数个数重载;支持不定参数fn join(sep, &agrgs) { ... } ;支持参数解包let list = seq.list(1, 2); add(*list) ;和js类似函数可以作为参数传递;通过AviatorEvaluator.addFunction(AviatorFunction) 可以添加自定义函数;AviatorEvaluator.addInstanceFunctions(String, Class) 可以添加实例方法;AviatorEvaluator.addStaticFunctions(String, Class) 可以添加静态方法;最后一个不以分号结尾的表达式会作为函数(或脚本)的返回值 |
MVEL | def 或 function 定义函数 def add(x, y) { return x + y;} lambda函数:def (x, y) { x + y } |
最后一个表达式会作为函数(或脚本)的返回值 |
OGNL | lambda #fact = :[#this<=1? 1 : #this*#fact(#this-1)], #fact(30H) |
@class@method(args) 调用静态方法;@class@field 访问静态属性 |
SpEl | 不支持 | |
QLExpress | 函数:function add(int a, int b){ return a + b; }; 不支持lambda |
支持宏 |
JEXL | 函数:var add = function(x, y) { x + y } lambda函数:var add = (x, y) -> { x + y } |
最后一个表达式会作为函数(或脚本)的返回值 |
JUEL | 不支持 | 不支持构造函数 |