初步运用QL表达式

最近发现,阿里的QLExpress很好用。

比如有个场景。

根据如果人员的city=1 age>70 sex=2 则可以领取补贴。

那么可以直接定义表达式:

 String exp = "if (city ==1 and age>70 and sex==1) then {return 33;} ";

然后调用表达式执行就可以了。

但我考虑到,如果有多种情况,全部卸载一个表达式里面就不是很直观。

这样就需要一个list 获取保存全部的表达式,然后依次执行找到属于的。

 

然后传入数据是一个map

所以这里创建一个类QLTools

import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class QLTools {

    public static void setQlContextByParams(Map params, DefaultContext context) {
        //循环获取map的 key 和value
        Iterator<String> iter = params.keySet().iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            Object value = params.get(key);
            context.put(key, value);
        }
    }

    public static Map baseExecute(ExpressRunner runner, List<String> expList, Map params) throws Exception {

        //1 组建context
        DefaultContext<String, Object> context = new DefaultContext<String, Object>();
        setQlContextByParams(params,context);
        Object result=null;
        Map resMap=new HashMap();
        for(String exp:expList){
            Object r = runner.execute(exp, context, null, false, true, null);
            if(r!=null){
                if(result!=null){
                    resMap.put("code","002");
                    resMap.put("msg","当前条件能找到不止一个符合的结果!请检查表达式");
                    return resMap;
                }else{
                    result=r;
                }
            }
        }
        if(result==null){
            resMap.put("code","001");
            resMap.put("msg","未找到符合表达式的结果!请检查");
        }else{
            resMap.put("code","000");
            resMap.put("msg","成功");
            resMap.put("result",result);

        }
        return resMap;

    }

 

测试方法:

    @Test
    public void test1() throws Exception {
        ExpressRunner runner = new ExpressRunner(true,true);
        Map params = new HashMap<>();
        params.put("city",2);
        params.put("age","77");
        params.put("sex",1);
        String exp2 = "if (city ==1 and age>70 and sex==1) then {return 33;} ";
        String exp3 = "if (city==2 and age>70 and sex==1) then {return 2;}";
        List<String> expList = new ArrayList<>();
        expList.add(exp2);
        expList.add(exp3);
        Map result = QLTools.baseExecute(runner, expList, params);
        if(!result.get("code").equals("000")){
            System.out.println(result.get("msg"));
        }else{
            System.out.println("操作成功");
            System.out.println(result.get("result"));
        }


    }
}

这样之后可以考虑将表达式存在sql里面,新增或者修改相应字段即可。

好像一些验证流程,运算流程都可以走ql表达式来进行判定。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值