学习使用AviatorScript 写脚本对数据进行处理。
这边写一些常见的例子,都使用表达式的方式(使用文本的话,无法传具体的参数)
aviator maven最新的引用:
com.googlecode.aviator
aviator
5.3.1
// 表达式
public static void testExpr() {
String expression = "let a = 'a is : '+a+b-c;"; // 报错,无法识别-c
expression = "let a = 'a is : '+a+b+c;";
expression = "let a = 'a is : '+(a+b-c);";
Expression compiledExp = AviatorEvaluator.compile(expression);
Map env = new HashMap<>();
env.put("a", 2);
env.put("b", 45);
env.put("c", -199.100);
Object result = compiledExp.execute(env);
System.out.println(result);
}
如果是计算,最好还是用括号括起来。
// 复杂map赋值
public static void testExprMap() {
// 多重引用的,需要多层嵌套map
String expression = "let a = $TABLE.A2_WARNING_APPLY.ORDERTYPE==5?8:18;" + " 'a is : '+(a+b-c)";
Expression compiledExp = AviatorEvaluator.compile(expression);
Map env = new HashMap<>();
Map aEnv = new HashMap<>();
Map bEnv = new HashMap<>();
aEnv.put("A2_WARNING_APPLY", bEnv);
bEnv.put("ORDERTYRE", 5);
env.put("$TABLE", aEnv);
env.put("a", 2);
env.put("b", 45);
env.put("c", -199.100);
Object result = compiledExp.execute(env);
System.out.println(result);
}
数据层级引用的话,需要map层级嵌套。如果数据是 A2_WARNING_APPLY.ORDERTYPE = 5 整个数据的,考虑进行整个替换,内容和表达式都进行替换。
// ifeiselse逻辑判断
public static void testIfCondition() {
String expression = "let state = { if ($row.state == 'A'){ return '使用';} elsif ($row.state == 'F'){ return '完成';} else { return '其它';}};";
Map env = new HashMap<>();
Map aEnv = new HashMap<>();
aEnv.put("state", "F");
env.put("$row", aEnv);
Expression compiledExp = AviatorEvaluator.compile(expression);
Object result = compiledExp.execute(env);
System.out.println(result);
}
请注意,代码块都必须用大括号包起来,哪怕是单行语句
// 时间
public static void testDate() {
String expression = " let d = new java.util.Date(); let year = getYear(d); let month = getMonth(d); let time = getTime(d); return time;";
Map env = new HashMap<>();
env.put("startTime", "2020-3-18 20:33:25");
// 启用基于反射的方法查找和调用
AviatorEvaluator.setFunctionMissing(JavaMethodReflectionFunctionMissing.getInstance());
Expression compiledExp = AviatorEvaluator.compile(expression);
Object result = compiledExp.execute(env);
System.out.println(result);
}
可以获取到当前的时间,但是无法传具体的时间参数,整个得特殊处理。
// list 类型
public static void testList() {
String expression = "let list = seq.list(a, b, c); list[0] = 4; return list;";
Map env = new HashMap<>();
env.put("a", 2);
env.put("b", 45);
env.put("c", -199.100);
Expression compiledExp = AviatorEvaluator.compile(expression);
Object result = compiledExp.execute(env);
System.out.println(result);
}
// list 字符类型
public static void testListStr() {
String expression = "let list = seq.list(a, b, c); list[0] = 'yan'; return list;";
Map env = new HashMap<>();
env.put("a", "wonder");
env.put("b", "me");
env.put("c", "dream");
Expression compiledExp = AviatorEvaluator.compile(expression);
Object result = compiledExp.execute(env);
System.out.println(result);
}
// map 处理
public static void testMap() {
String expression = "let m = seq.map(\"a\", a, \"b\", b, \"c\", c, 4, 5); ";
// 获取属性a的值 合法 m.key 非合法 seq.get(m, key) 读取的时候用单引号
expression = expression
+ "m.a = 100; println(\"m.a = \" + m.a); println(\"m.a = \" + seq.get(m, 'a')); return m;";
Map env = new HashMap<>();
env.put("a", 2);
env.put("b", 45);
env.put("c", -199.100);
Expression compiledExp = AviatorEvaluator.compile(expression);
Object result = compiledExp.execute(env);
System.out.println(result);
}
// 获取map的keys 和 values
public static void testMapKeys() {
String expression = "let m = seq.map(\"a\", a, \"b\", b, \"c\", c, 4, 5); ";
// 获取 key 的集合,用 seq.keys(m) 函数; value 集合是用 seq.vals 函数:
expression = expression + "p(\"key set: \" + seq.keys(m)); p(\"value set: \" + seq.vals(m)); return m;";
Map env = new HashMap<>();
env.put("a", 2);
env.put("b", 45);
env.put("c", -199.100);
Expression compiledExp = AviatorEvaluator.compile(expression);
Object result = compiledExp.execute(env);
System.out.println(result);
}
测试
public static void main(String args[]) {
testExpr();
testExprMap();
testIfCondition();
testDate();
testList();
testListStr();
testMap();
testMapKeys();
}
使用Aviator写脚本,总体语法跟java相似,比较好学。对于多层数据引用的,需要层级处理map,这个麻烦些;对于时间的处理,目前没看到比较好的方式,就只能获取当前时间的值;list和map类型都是单层的,不能是List