概述
文章目录
- 前言
- 一图胜千言
- 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 {
@Override
public 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)")
@Override
public 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)"));
//向 函数 传入 map
Map<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 的使用的全部内容,希望文章能够帮你解决0.1、Aviator 的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复