在前面我们做过了很多关于QLExpress的规则引擎的介绍。正好最近正在使用规则引擎,所以这里我们来讲一些案例。
本案例主要是使用规则引擎做一些基本的加减乘除运算。QLExpress其实本身是支持基础的加减乘除运算的,但是在实际中,其实大多面临的场景都是在一些集合里面进行计算,所以对于传递到参数来说就比较讲究了。根据QLExpress的语法来看,我们这里就需要自定义方法来实现。
那么自定义加减乘除的方法怎么做呢?这里我们要遵循一些规则。
1、function只能传基本类型,不能直接传进去一个集合,所以我们可以把集合打散,使用逗号切割的方式组成一个string字符串,再进行转换使用。 2、需要考虑计算的精度问题
基于上诉两点,我们有了一定的思路,所以下面直接演示代码:
1、首先定义相关的加减乘除方法
每一个类型,我们定义一个function即可。然后在使用的时候使用逗号切割成集合,再使用bigdecimal来保证计算的精度,详细代码示例如下:
package com.test; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import org.apache.commons.lang.StringUtils; public class RuleFunction { /** * 获取最大值 * * @param values * @return */ public BigDecimal getMaxValue(String values) { BigDecimal base = new BigDecimal("0"); try { ArrayList<BigDecimal> list = new ArrayList<BigDecimal>(); if (StringUtils.isNotBlank(values)) { String[] tokens = values.split(","); for (String token : tokens) { list.add(new BigDecimal(token)); } } if (list.size() > 0) { Collections.sort(list, new Comparator<BigDecimal>() { public int compare(BigDecimal o1, BigDecimal o2) { return o2.compareTo(o1); } }); return list.get(0); } } catch (Exception e) { e.printStackTrace(); } return base; } /** * 获取总数 * * @param values * @return */ public Integer getCountValue(String values) { int sum = 0; try { if (StringUtils.isNotBlank(values)) { String[] tokens = values.split(","); sum = tokens.length; } } catch (Exception e) { e.printStackTrace(); } return sum; } /** * 获取求和 * * @param values * @return */ public BigDecimal getSumValue(String values) { BigDecimal base = new BigDecimal("0"); try { if (StringUtils.isNotBlank(values)) { String[] tokens = values.split(","); for (String token : tokens) { base = base.add(new BigDecimal(token)); } } } catch (Exception e) { e.printStackTrace(); } return base; } /** * 获取最小值 * * @param values * @return */ public BigDecimal getMinValue(String values) { BigDecimal base = new BigDecimal("0"); try { ArrayList<BigDecimal> list = new ArrayList<BigDecimal>(); if (StringUtils.isNotBlank(values)) { String[] tokens = values.split(","); for (String token : tokens) { list.add(new BigDecimal(token)); } } if (list.size() > 0) { Collections.sort(list, new Comparator<BigDecimal>() { public int compare(BigDecimal o1, BigDecimal o2) { return o1.compareTo(o2); } }); return list.get(0); } } catch (Exception e) { e.printStackTrace(); } return base; } /** * 求平均 * * @param values * @return */ public BigDecimal getAVGValue(String values) { BigDecimal base = new BigDecimal("0"); try { if (StringUtils.isNotBlank(values)) { String[] tokens = values.split(","); for (String token : tokens) { base = base.add(new BigDecimal(token)); } base = base.divide(new BigDecimal(tokens.length),2,RoundingMode.HALF_DOWN); } } catch (Exception e) { e.printStackTrace(); } return base; } }
2、在使用runner之前,我们动态的加载上对应的function
package com.test; import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; /** * Hello world! * */ public class App { public static void main(String[] args) throws Exception { String expr1 = "总分=SUM(每月评分)"; ExpressRunner runner = new ExpressRunner(); // 添加最大值的计算方法 runner.addFunctionOfClassMethod("MAX", RuleFunction.class.getName(), "getMaxValue", new String[] { "String" }, null); // 添加count计数的计算方法 runner.addFunctionOfClassMethod("COUNT", RuleFunction.class.getName(), "getCountValue", new String[] { "String" }, null); // 添加sum求和的计算方法 runner.addFunctionOfClassMethod("SUM", RuleFunction.class.getName(), "getSumValue", new String[] { "String" }, null); // 添加min最小值的计算方法 runner.addFunctionOfClassMethod("MIN", RuleFunction.class.getName(), "getMinValue", new String[] { "String" }, null); // 计算平均 runner.addFunctionOfClassMethod("AVG", RuleFunction.class.getName(), "getAVGValue", new String[] { "String" }, null); DefaultContext<String, Object> context = new DefaultContext<String, Object>(); String params2 = "1.25,1.78,1.65,1,1,1,1.62,0.6,7.6"; context.put("每月评分", params2); Object r = runner.execute(expr1, context, null, true, false); System.out.println(r); } }
直接执行就会出来相关的结果。
QLExpress是一套java编写的规则引擎框架,所以我们在使用的时候,可以很轻松掌握它的相关用法。直接嵌套引用即可。以上就是我们使用QLExpress定义加减乘除基本运算的案例。
还没有评论,来说两句吧...