0.1、Aviator 的使用
文章目录
- 前言
- 一图胜千言
- 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 的使用相关推荐
- java规则引擎Aviator
在灰度系列中<基于springcloud的灰度实现方案(二)>,之前规则适配使用数据库+策略模式实现,单个规则还好,多个规则,各种场景使用,还是稍微有点欠缺.就想着用java规则引擎来解决 ...
- 估算带卷积核二分类0,3的网络的收敛时间和迭代次数
制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...
- (转)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 ...
- 【规则引擎】一、规则引擎简介
(第一章规则引擎学习入门之规则引擎简介)# 系列文章目录 规则引擎简介 前言 一.为什么要使用规则引擎? 1.不使用规则引擎的规则执行现状 2. 规则引擎优点 二.规则引擎的功能 三.规则引擎的分类实 ...
- 神经网络收敛标准与准确率之间的数学关系
制作一个带一个3*3卷积核的神经网络,测试集是minst的0和2图片集,将28*28的图片缩小成9*9,隐藏层30个节点所以网络的结构是 S(minst0)-(con3*3)49-30-2-(1,0) ...
- 用共振频率去进行图片分类的尝试
假设有一种物质,这种物质的原子核的质子数和电子数可以不同,允许质子的带电量不同,并且质子带负电,同时这个原子的电子不满足鲍利不相容原理,环境温度是 (1/1.3806505)*10^23k,电子波的频 ...
- 收敛标准对迭代次数影响
制作一个n*n的网络,将收敛标准分别设定在,0.001,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,观察网络达到平衡时迭代次数的变化. 比如如图的 ...
- vue省市区三级联动mysql,js/json,html/jsp
大家好,我是烤鸭: 省市区三级联动数据及页面: 测试的时候,发现少了几个地区,现在补上了,也优化了下排版. 如果你懒得复制和看的话,这里是打包的下载地址. 之前的资源地址也改了,http://down ...
- ZAM 3D 制作3D动画字幕 用于Xaml导出
ZAM 3D 制作3D动画字幕 用于Xaml导出 原文:ZAM 3D 制作3D动画字幕 用于Xaml导出 原地址-> http://www.cnblogs.com/yk250/p/5662788 ...
- 将执行文件转化为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 ...
最新文章
- java类为什么要建两个class_ClassLoader的几个概念、类和对象的解释
- 06Decorator(装饰)模式
- python websocket爬虫_详解python websocket获取实时数据的几种常见链接方式
- JAVA进阶教学之(StringBuider进行字符串拼接)
- java怎么将图片文件转流并在jsp前端显示_jsp已经被淘汰了吗?
- 《人月神话》——一部被名字误导的软件开发的书——第一次阅读
- TensorFlow实现mnist手写数字识别项目代码
- python上传文件到oss_python实现上传文件到OSS
- Http接口开发以及异常调试
- 数据库身份证号用什么类型_数据库设计规范
- Tushare Day7—— 第19章投资组合理论及拓展
- colab设置成英文
- 一个关于意念(脑电波)的想法
- android循环录制,按键精灵安卓版为什么我录制的脚本无法循环
- props写法_vue props default Array或是Object的正确写法说明
- iPhone播放声音文件的例子
- Python分析照片详细拍摄地点源代码(可详细到具体酒店)
- V语言(Vlang)初探
- Qt创建线程两种方式的区别
- 三本计算机的专业需要考研嘛,三本计算机考研难吗
热门文章
- 杰理之关于 TWS 声道配置【篇】
- 基于朴素贝叶斯的垃圾邮件过滤实现
- Ubuntu的压缩工具
- 计算机房的英语的手写体,初二英语旅游加中文日记_事故现场_划痕
- Android开发面试:架构设计和网络知识答案精解
- 河内塔问题_河内塔的Python程序
- BUG记录-Java服务端获取不到请求头里的token
- 使用glPushMatrix和glPopMatrix的原因
- D3D渲染遇到的问题
- 中银国际计算机首席分析师,[券业场]中银国际前首席陈乐天跳槽腾讯 从事金融产品研究...