Aviator 常见使用

2023-11-08

学习使用AviatorScript 写脚本对数据进行处理。

这边写一些常见的例子,都使用表达式的方式(使用文本的话,无法传具体的参数)

aviator maven最新的引用

<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>5.3.1</version>
</dependency>

例子

表达式

    // 表达式
    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<String, Object> 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<String, Object> env = new HashMap<>();
        Map<String, Object> aEnv = new HashMap<>();
        Map<String, Object> 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<String, Object> env = new HashMap<>();
        Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<Map>的类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aviator 常见使用 的相关文章

随机推荐

  • Vue第二篇:概念深度剖析

    参考链接 https www bilibili com video BV1oj411D7jk spm id from 333 788 recommend more video 0 vd source 3969f30b089463e19db0
  • 人生如一趟旅行

    http www putclub com html download life prose 2011 0311 27595 html Life is like a train ride We get on We ride We get of
  • HikariPool一直报连接不可用

    前言 一开始发现测试环境报错 原先配置6现在配置20依然还是很频繁的报错 想看下底层到底如何处理的导致这个问题 到底什么情况 排查 看了下日志连接数大量的空闲 看日志活跃的却是满的疑惑 2023 07 18 13 17 15 258 xxl
  • Java EnumMap putAll()方法具有什么功能呢?

    转自 Java EnumMap putAll 方法具有什么功能呢 下文笔者讲述EnumMap中putAll 方法的功能简介说明 如下所示 EnumMap中putAll 方法的功能 向map中批量添加一个map元素 EnumMap中putAl
  • MSBuild入门(续)

    MSBuild基本概念 续 在上一篇简单的介绍了下MSBuild中的四个基本块 每块介绍比较单薄 在这里对在大多数的项目模版生成的 proj文件中比较常见一些用法和概念做些补充 主要有一下几方面 MSBuild特殊字符 MSBuild保留的
  • 狄利克雷卷积 && 莫比乌斯反演

    狄利克雷卷积 莫比乌斯反演 狄利克雷卷积 数论函数及其运算 数论函数是指定义域是正整数 值域是一个数集的函数 加法 逐项相加 即 f h n f n h n 数乘 这个数和每一项都相乘 即 xf n x f n 狄利克雷卷积 定义两个数论函
  • Verilog 实现千兆网UDP协议 基于88E1111--数据发送

    Verilog 实现千兆网UDP协议 基于88E1111 数据发送 注 此版本没有添加ARP PING 等 未完待续 注 项目采用Verilog开发 基于Vivado编译器 UDP User Datagram Protocol 一种基本的
  • Ubuntu上面安装go语言

    一 下载go语言安装包 官方地址 https golang google cn dl 我这里下载的是go1 18 4 linux amd64 tar gz版本 二 把压缩包传入linux系统中 1 可以通过xshell连接Ubuntu系统
  • 关于海康,宇视,天地伟业摄像头调试

    最近在项目中需要读取摄像机的内容 现有的摄像机有海康威视 宇视 和天地伟业三家的摄像机 一开始 天地伟业和宇视都给了demo 即html和css代码 是可以读取视频流的 但是海康威视没有给demo 只是告诉我们可以通过vlc来读取视频流的内
  • 使用Inno Setup 打包成exe安装包+执行外部脚本文件

    有时候我们将软件需要做成类似下载后双击就能安装的程序 那么就需要使用打包工具进行打包 打包工具很多 有的简单 有的过程也比较复杂 如果有能力 自己可以写一个安装器 类似腾讯视频 优酷视频 哔哩哔哩的PC安装界面 这种就特别高大上 今天 主要
  • c++调用mxnet模型做预测

    python在深度学习领域很火 做实验用python很舒服 但是生产环境下可能还是需要c c 那么问题来了 mxnet训练出来的模型如何在c c 下调用 以下是一些填坑的经验分享一下 mxnet支持c c 调用模型 但目前不是全部的网络模型
  • 双向可控硅的四象限触发方式

    双向可控硅的四象限触发方式 双向可控硅是在普通可控硅的基础上发展而成的 它不仅能代替两只反极性并联的可控硅 而且仅需一个触发电路 是目前比较理想的交流开关器件 其英文名称TRIAC即三端双向交流开关之意 尽管从形式上可将双向可控硅看成两只普
  • SpringBoot入门到项目实战,带你快速上手springboot

    动力节点王鹤老师的SpringBoot入门系列课程 通俗易懂 基于SpringBoot2 4版本讲解 从细节入手 每个事例先讲解pom xml中的重要依赖 其次application配置文件 最后是代码实现 让你知其所以 逐步让掌握Spri
  • 适合Python 的5大练手项目,你练了么?

    往期好文推荐 0基础不用怕 从0到1轻松教你入门Python python系统学习流线图 教你一步一步学会python 但是在练手项目的选择上 还存在疑问 不知道要从哪种项目先下手 python教程入门学习 首先有两点建议 最好不要写太应用
  • ios后台运行

    iOS在升级到4 0以后就支持了多任务了 下文将详细介绍一下这个特性 1 检查设备是否支持多任务 Apple出于性能的考虑 并不是所有的iOS设备升级到iOS4以后都支持多任务 比如iPhone 3G 如果你的应用在没有多任务特性时会出问题
  • Nv21转Bitmap(高效率转化)

    转自 https blog csdn net qq1137830424 article details 81980673 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 ht
  • 广义线性回归模型之0,1变量回归(logit/probit回归)—R语言实现

    1 广义线性回归 广义线性模型有三个组成部分 1 随机部分 即变量所属的指数族分布 族成员 诸如正态分布 二项分布 Poisson 分布等等 2 线性部分 即 x 3 连接函数 g R 中的广义线性模型函数glm 对指数族中某分布的默认连接
  • Redis的发布订阅模式:实现消息队列和实时数据推送的利器

    当涉及到实时数据推送和消息队列时 Redis的发布订阅模式是一种非常有用的工具 Redis是一个开源的内存数据库 被广泛用于缓存 队列和实时数据处理等方面 在本博客中 我们将重点介绍Redis的发布订阅模式 并且提供一些示例代码来帮助读者更
  • pandoc -crossref插件实现markdwon文档转word后公式编号自定义

    pandoc crossref插件实现markdwon文档转word后公式编号自定义 借助markdown撰写论文还是有一些优势的 公式可以通过vscode 提示直接快速地写出来 图片按照链接插入以后就可以自动更新图源 论文提交的时候需要转
  • Aviator 常见使用

    学习使用AviatorScript 写脚本对数据进行处理 这边写一些常见的例子 都使用表达式的方式 使用文本的话 无法传具体的参数 aviator maven最新的引用