在前面我们做过了很多关于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定义加减乘除基本运算的案例。










还没有评论,来说两句吧...