前言
业务需求中遇到字符串所组成的数学表达式,替换完数据后想计算出结果; 类似于这样
1. (400-0)*100+(600-400)*150+(配置值-600)*PV
2. 配置值*PV*(-10)
但是让Java做字符串的数学操作很麻烦,所以引入新的jar处理
参考文档 QLExpress README.md
pom
QLExpress 为阿里开源的一个动态脚本引擎解析工具
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.2.7</version>
</dependency>
示例一 数学公式
public static void main(String[] args) throws Exception {
ExpressRunner runner = new ExpressRunner();
DefaultContext<String, Object> context = new DefaultContext<>();
String str="(400-0)*100+(600-400)*150+(配置值-600)*PV";
context.put("配置值",5);
context.put("PV",1);
Object result = runner.execute(str, context, null, true, false);
System.out.println(result);
}
注意自己替换的关键字后 式子必须为正确的可计算式子,出现未知数会报错
入参
示例二 布尔值
有时候表达式的结果为布尔值,类似于这样
配置值=3
配置值>4
配置值<=9
1<配置值<5
1<=配置值<=5
>15
需要知道是否符合某个指定条件
普通java语法
n = 10;
sum = 0;
for(i = 0; i < n; i++) {
sum = sum + i;
}
return sum;
a = 1;
b = 2;
maxnum = a > b ? a : b;
这些他是支持的,But,业务中的拓展,类似于配置值=3 或1<配置值<5 这类替换情况,这个工具类不能处理,因为Java语言识别布尔有特定条件,正确表达为
配置值=3 ==> 配置值==3 (需要两个等于号)
1<配置值<5 ==> 1<配置值 && 配置值<5 (需要分别做判断再与操作)
>15 ==> 配置值>15(缺乏替换配置条件,必须有个关键字用来后续替换)
为了解决上述问题,我们在传参之前,需要对表达式进行处理
private String defaultValue="配置值";
private String defaultValue2="<配置值<";
private String defaultValue3="<=配置值<";
private String defaultValue4="<=配置值<=";
private String defaultValue5="<配置值<=";
public String judgeStr(String str){
if(!str.contains(defaultValue)){
return defaultValue+str;
}
if(str.contains(defaultValue+"=")){
return str.replace("=","==");
}
if(str.contains(defaultValue2)||str.contains(defaultValue3)||str.contains(defaultValue4)||str.contains(defaultValue5)){
return str.replace(defaultValue,defaultValue+"&&"+defaultValue);
}
System.out.println("其他表达式:"+str);
return str;
}
Object result = runner.execute(judgeStr(str), context, null, true, false);
输出为布尔值
拓展
另一个工具类也可以处理上述请求,可以尝试JEP
|