概述
在业务中会遇到一些场景的运算方式不是固定的,而且内容不是有规律的,无法落库到表中(强行落库后也需要针对该内容硬编码写一段特殊的查询方式);
这个时候将这部分计算抽取出来,用一个动态的脚本去执行可能会更友好一些;
当前环境
springboot 2.7.4
jdk 1.8
maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.3.2</version>
</dependency>
demo
@SneakyThrows
public static void main(String[] args) {
ExpressRunner runner = new ExpressRunner();
DefaultContext<String, Object> context = new DefaultContext<String, Object>();
context.put("a", 11);
context.put("b", 16);
context.put("c", 3);
String express = "if (a + b > 10) { " +
" if (b - a < 5) { " +
" return 'b - a < 5';" +
" } else { " +
" return 'b - a >= 5';" +
" } " +
"} else { " +
" return 'a is not greater than 10';" +
"}";
Object r = runner.execute(express, context, null, true, false);
System.out.println(r);
}
输出结果
引入function方法
有时候在运算之前需要前置计算获取结果,此时在脚本中引入function
方法就舒服多了;
可以使用的java基础类型
- 基本数据类型:
int、long、short、byte(整数类型)
float、double(浮点数类型)
boolean(布尔类型)
char(字符类型)
- 包装类:
Integer、Long、Short、Byte(对应基本类型的包装类)
Float、Double
Boolean
Character
java.math.BigDecimal(用于高精度的十进制数)
java.math.BigInteger(用于高精度的整数)
- 字符串:
String
- 数组:
int[]、String[] 等
- 集合:
List、Set、Map 等
- 日期和时间:
java.util.Date
java.time.LocalDate、java.time.LocalDateTime 等(需要导入相应的包)
function grossWeightCondition(String sm2){
if(sm2 == '123'){
return 35;
}else if(sm2 == '456'){
return 70;
}else {
return 50;
}
};
return 变量1 > grossWeightCondition(变量2);
执行结果