0.1、Aviator 的使用

前言

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页