文章目录

  • 前言
  • 一图胜千言
  • Maven 依赖
  • 代码 Demo
    • 工具类和测试
    • 测试结果
    • 参考

前言

google 公司提供了一个工具包,可以方便的用于复杂规则的校验场景。

一图胜千言

Maven 依赖

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

代码 Demo

工具类和测试

提供一个工具类,测试方法为main函数

package com.del;import com.alibaba.druid.util.StringUtils;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.function.FunctionUtils;
import com.googlecode.aviator.runtime.type.AviatorDouble;
import com.googlecode.aviator.runtime.type.AviatorObject;
import io.netty.util.internal.StringUtil;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** Repository 相关 Aviator 工具类*/
public class RepositoryAviatorUtil {/*** 仅支持简单的 数字 的加减乘除 运算,返回结果必须是整数* @param express* @return*/public static Long justForLong(String express){//"(1+2)/3"return (Long)AviatorEvaluator.execute(express);}/*** 仅支持简单的 数字 的加减乘除 运算,返回结果必须是整数* @param express* @return*/public static Long justForLong(String express,Long... values){//"(1+2)/3"return (Long)AviatorEvaluator.exec(express,values);}/*** 仅支持简单的 数字 的加减乘除 运算,返回结果必须是浮点类型* @param express* @return*/public static Double justForDouble(String express){return (Double)AviatorEvaluator.execute(express);}/*** 支持多个字符串变量,会自动按照顺序替换* @param express* @return 返回类型为字符串*/public static String justForStrValues(String express,String... values){//("'My name is '+ theName + ',my age is '+theAge","Jecket","20"));return (String)AviatorEvaluator.exec(express,values);}/*** 支持多个字符串变量,会自动按照顺序替换* @param express* @return 返回类型为字符串*/public static String justForStrValues(String express,Long... values){//("'My age is '+ value1 + ',her age is '+value2",20L,20L));return (String)AviatorEvaluator.exec(express,values);}/*** 支持的变量类型为 Map,返回类型为字符串* @param express* @return*/public static String justForStrMap(String express, Map map){/*** Map map1 = new HashMap();* map1.put("theName","Jecket");* map1.put("theAge","20");* ("'My name is '+ theName",map1))*/return (String)AviatorEvaluator.execute(express,map);}/*** 字符串转时间(java.util.Date)* @param date  "20210101 14:25:01"* @param format "yyyyMMdd hh:mm:ss"* @return*/public static Date strToDateFunction(String date, String format){//"string_to_date('2018-09-11',\"yyyymmdd\")return (Date)AviatorEvaluator.exec("string_to_date(date,format)",date,format);}/*** 时间(java.util.Date)转字符串* @param date  Date* @param format "yyyyMMdd hh:mm:ss"* @return*/public static String DateToStrFunction(Date date, String format){//"date_to_string('2018-09-11',\"yyyymmdd\")return (String)AviatorEvaluator.exec("date_to_string(date,format)",date,format);}/*** 截取字符串* @param str   被截取字符串* @param index 起始位置 >=0* @param length 截取长度* @return*/public static String subString(String str,Long index,Long length){if(StringUtils.isEmpty(str)||str.length()<=0||index>=str.length()||(index+length)>str.length()){return "";}else{return (String)AviatorEvaluator.exec("string.substring(str,index,length)",str,index,length);}}/*** str 是否 包含 str2* @param str* @param str2* @return*/public static Boolean containsStr(String str,String str2){if(StringUtils.isEmpty(str)&&str2.isEmpty()){return Boolean.TRUE;}if(StringUtils.isEmpty(str)&&!str2.isEmpty()){return Boolean.FALSE;}if(!StringUtils.isEmpty(str)&&str2.isEmpty()){return Boolean.FALSE;}return (Boolean) AviatorEvaluator.exec("string.contains(str,str2)",str,str2);}static{initSelfFunction();}private static void initSelfFunction(){AviatorEvaluator.addFunction(new AviatorMultiplication());}/*** 自定义函数-乘法* 需要 提前 加载 AviatorEvaluator.addFunction(new AviatorMultiplication());* 然后通过 以下方式调用* Map<String, Object> env = new HashMap<String,Object>();* AviatorEvaluator.execute("setNameHere(2,5)")* AviatorEvaluator.execute("setNameHere(2,5)",env)* AviatorEvaluator.execute("setNameHere(2,5)",env,true)*/private static class AviatorMultiplication extends AbstractFunction {@Overridepublic AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {Number num1 = FunctionUtils.getNumberValue(arg1,env);Number num2 = FunctionUtils.getNumberValue(arg2,env);//乘法AviatorObject o =  new AviatorDouble(num1.doubleValue() * num2.doubleValue());if(env!=null){//判断传入参数if(env.get("return0")!=null&&(Boolean)env.get("return0")){return new AviatorDouble(0);}}return o;}//设置函数名称,后面调用时会用到 AviatorEvaluator.execute("setNameHere(2,5)")@Overridepublic String getName() {return "setNameHere";}}public static void main(String [] args){System.out.println(RepositoryAviatorUtil.justForLong("(1+2)/3"));System.out.println(RepositoryAviatorUtil.justForLong("a+b",1L,2L));System.out.println(RepositoryAviatorUtil.justForDouble("1.1+2.1"));System.out.println(RepositoryAviatorUtil.justForStrValues("'My name is '+ theName + ',my age is '+theAge","Jecket","20"));System.out.println(RepositoryAviatorUtil.justForStrValues("'My age is '+ value1 + ',her age is '+value2",20L,20L));Map map1 = new HashMap();map1.put("theName","Jecket");map1.put("theAge",20);System.out.println(RepositoryAviatorUtil.justForStrMap("'My name is '+ theName + ',my age is '+theAge",map1));Date date = RepositoryAviatorUtil.strToDateFunction("20210101 14:25:01","yyyyMMdd hh:mm:ss");System.out.println(new SimpleDateFormat("yyyy年MM月dd日").format(date));System.out.println(RepositoryAviatorUtil.DateToStrFunction(new Date(),"yyyyMMdd hh:mm:ss"));System.out.println(RepositoryAviatorUtil.subString("abcdef",0L,6L));System.out.println(RepositoryAviatorUtil.containsStr("abcdef","abc"));//需要 Init 方法提前加载System.out.println(AviatorEvaluator.execute("setNameHere(2,5)"));//向 函数 传入 mapMap<String, Object> env = new HashMap<String,Object>();env.put("return0",true);System.out.println(AviatorEvaluator.execute("setNameHere(2,5)",env));//开启缓存System.out.println(AviatorEvaluator.execute("setNameHere(2,5)",env,true));}
}

测试结果

1
3
3.2
My name is Jecket,my age is 20
My age is 20,her age is 20
My name is Jecket,my age is 20
2021年01月01日
20210125 02:38:16
abcdef
true
10.0
0.0
0.0

参考

[1]、https://www.jianshu.com/p/87a647d02442
[2]、https://blog.csdn.net/qq_27384769/article/details/80639122

0.1、Aviator 的使用相关推荐

  1. java规则引擎Aviator

    在灰度系列中<基于springcloud的灰度实现方案(二)>,之前规则适配使用数据库+策略模式实现,单个规则还好,多个规则,各种场景使用,还是稍微有点欠缺.就想着用java规则引擎来解决 ...

  2. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  3. (转)A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?' (se ...

  4. 【规则引擎】一、规则引擎简介

    (第一章规则引擎学习入门之规则引擎简介)# 系列文章目录 规则引擎简介 前言 一.为什么要使用规则引擎? 1.不使用规则引擎的规则执行现状 2. 规则引擎优点 二.规则引擎的功能 三.规则引擎的分类实 ...

  5. 神经网络收敛标准与准确率之间的数学关系

    制作一个带一个3*3卷积核的神经网络,测试集是minst的0和2图片集,将28*28的图片缩小成9*9,隐藏层30个节点所以网络的结构是 S(minst0)-(con3*3)49-30-2-(1,0) ...

  6. 用共振频率去进行图片分类的尝试

    假设有一种物质,这种物质的原子核的质子数和电子数可以不同,允许质子的带电量不同,并且质子带负电,同时这个原子的电子不满足鲍利不相容原理,环境温度是 (1/1.3806505)*10^23k,电子波的频 ...

  7. 收敛标准对迭代次数影响

    制作一个n*n的网络,将收敛标准分别设定在,0.001,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,观察网络达到平衡时迭代次数的变化. 比如如图的 ...

  8. vue省市区三级联动mysql,js/json,html/jsp

    大家好,我是烤鸭: 省市区三级联动数据及页面: 测试的时候,发现少了几个地区,现在补上了,也优化了下排版. 如果你懒得复制和看的话,这里是打包的下载地址. 之前的资源地址也改了,http://down ...

  9. ZAM 3D 制作3D动画字幕 用于Xaml导出

    ZAM 3D 制作3D动画字幕 用于Xaml导出 原文:ZAM 3D 制作3D动画字幕 用于Xaml导出 原地址-> http://www.cnblogs.com/yk250/p/5662788 ...

  10. 将执行文件转化为bat批处理文件的工具(批处理文件方式提供)

    update 2006.4.25 15:20 支持64kb以上的执行文件/// @echo e 0100 4d 5a 90 0 3 0 0 0 4 0 0 0 ff ff 0 0 >>Da ...

最新文章

  1. java类为什么要建两个class_ClassLoader的几个概念、类和对象的解释
  2. 06Decorator(装饰)模式
  3. python websocket爬虫_详解python websocket获取实时数据的几种常见链接方式
  4. JAVA进阶教学之(StringBuider进行字符串拼接)
  5. java怎么将图片文件转流并在jsp前端显示_jsp已经被淘汰了吗?
  6. 《人月神话》——一部被名字误导的软件开发的书——第一次阅读
  7. TensorFlow实现mnist手写数字识别项目代码
  8. python上传文件到oss_python实现上传文件到OSS
  9. Http接口开发以及异常调试
  10. 数据库身份证号用什么类型_数据库设计规范
  11. Tushare Day7—— 第19章投资组合理论及拓展
  12. colab设置成英文
  13. 一个关于意念(脑电波)的想法
  14. android循环录制,按键精灵安卓版为什么我录制的脚本无法循环
  15. props写法_vue props default Array或是Object的正确写法说明
  16. iPhone播放声音文件的例子
  17. Python分析照片详细拍摄地点源代码(可详细到具体酒店)
  18. V语言(Vlang)初探
  19. Qt创建线程两种方式的区别
  20. 三本计算机的专业需要考研嘛,三本计算机考研难吗

热门文章

  1. 杰理之关于 TWS 声道配置【篇】
  2. 基于朴素贝叶斯的垃圾邮件过滤实现
  3. Ubuntu的压缩工具
  4. 计算机房的英语的手写体,初二英语旅游加中文日记_事故现场_划痕
  5. Android开发面试:架构设计和网络知识答案精解
  6. 河内塔问题_河内塔的Python程序
  7. BUG记录-Java服务端获取不到请求头里的token
  8. 使用glPushMatrix和glPopMatrix的原因
  9. D3D渲染遇到的问题
  10. 中银国际计算机首席分析师,[券业场]中银国际前首席陈乐天跳槽腾讯 从事金融产品研究...