学习使用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;"; // 报错,无法识别-cexpression =  "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() {// 多重引用的,需要多层嵌套mapString 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 和 valuespublic 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>的类型。

Aviator 常见使用相关推荐

  1. java统计 pv uv_统计PV、UV的新武器——Aviator

    本文的主角Aviator,是一个高性能.轻量级的基于java实现的表达式引擎,它动态地将String类型的表达式编译成Java ByteCode并交给JVM执行. Aviator支持绝大多数运算操作符 ...

  2. Aviator(表达式执行引擎)发布1.0.1

    Aviator是一个表达式执行引擎,最近由于工作上的原因,又将这个东西扩充了一下,加入了静态的编译优化和seq库. 对于类似"1+2″这样由常量组成的表达式,会在编译的时候直接计算出结果而非 ...

  3. 常见的规则引擎(Drools,RuleBook,Easy Rules等)对比

    参考文章: https://www.jianshu.com/p/96cd60059aae 规则引擎调研 - 人在江湖之诗和远方 - 博客园 java开源规则引擎比较_常用规则引擎比较分析_学校砍了我的 ...

  4. java aviator使用类_Aviator学习笔记

    一.简单认识Aviator: Aviator是一个高性能.轻量级的 java 语言实现的表达式求值引擎,它动态地将表达式编译成字节码并运行,主要用于各种表达式的动态求值. Aviator的优点: Av ...

  5. 表达式引擎aviator

    转自:https://blog.csdn.net/keda8997110/article/details/50782848 简介 Aviator是一个高性能.轻量级的 java 语言实现的表达式求值引 ...

  6. Java表达式引擎Aviator

    java表达式引擎有很多,最后选择了Aviator.原因是:高性能.轻量级. Aviator 是将表达式直接翻译成对应的 java 字节码执行,除了依赖 commons-beanutils 这个库之外 ...

  7. Aviator 规则引擎介绍

    先说结论: 规则简单:qlexpress或者avaitor:规则复杂:drools 最终选择是因为:足够轻量级,社区活跃度较好,最新jar包更新于22年4月 官网 git地址 String expre ...

  8. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  9. 数据结构(01)— 算法复杂度概念及常见的复杂度计算

    1. 大 O 表示法 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度.大 O 表示法指出了最糟情况下的运行时间.大 O 表示法在讨论运行时间时, ...

最新文章

  1. 高中计算机二级考试是考什么时候,浅谈有效实施高中计算机教学的方法_计算机二级考试时间...
  2. 浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源
  3. 日期时间函数(1)-time()gmtime()strftime()localtime()
  4. faster rcnn的源码理解(一)SmoothL1LossLayer论文与代码的结合理解
  5. (旧)子数涵数·Flash——遮罩动画
  6. SQL语言实现金额小写转大写完整案例代码
  7. 搭建本地Ubuntu14.04源
  8. 讯飞输入法pad版x86_观察:不惧腾讯、阿里,科大讯飞推出在线文档App“讯飞文档”...
  9. 低代码工具让人人都是程序员?别再吐槽了,它能做这些事
  10. C#中对 XML节点进行增、删、改、查
  11. 安装Ubuntu18
  12. 关于数学建模竞赛经历
  13. halcon联合C#开发--连接大华相机读取二维码附源码
  14. 测试页能打印 软件不能打,Windows7分享打印机能打测试页打印文件怎么没反应
  15. 通俗易懂看RB-tree(二)
  16. JAVA 获取实时汇率
  17. seo文章批量更新-SEO文章自动批量生成
  18. Go语言圣经 - 第10章 包和工具 - 10.7 工具
  19. 都说C++难,那么它到底难在了哪里?
  20. oogle advertiser api开发概述——速率限制

热门文章

  1. 判断数字字符——Character.isDigit(char ch)实现源码详解
  2. 欢度中秋节!从零开始实现一个月饼检测器
  3. Ubuntu终端代理工具——proxychains
  4. Qt6串口多功能助手64位版本上位机源码
  5. NFT 产品设计路线图
  6. 【Python案例】爬取某bo热搜榜并做动态数据展示
  7. Android - 蓝牙开发
  8. android蓝牙简单开发
  9. 房地产销售转行学习Python的小哥哥入职起薪9K!
  10. matlab传递函数参数辨识,5.2 传递函数的频域辨识 系统辨识理论及Matlab仿真课件.ppt...