Aviator 常见使用

学习使用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赋值

    // 复杂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类型

    // 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类型

    // 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的类型。

你可能感兴趣的:(java,aviator,脚本)