java 开发时, 有场景需要通过表单传入的运算符和变量计算数学结果, 我们可以使用 spring el 处理数学运算和布尔表达式, 非常方便
/*
使用 spring el 表达式
计算数学运算
判断逻辑表达式返回值
声明变量 #变量
支持 && || > < <= >= ==
*/
// SpEL parser 可重用, 线程安全的
public static final ExpressionParser parser = new SpelExpressionParser();
/**
* 数学计算
*/
@Test
public void testMath() {
// 变量统一使用 # 作为前缀
Expression expression = parser.parseExpression("#a + #b");
StandardEvaluationContext ctx = new StandardEvaluationContext();
Map<String, Object> variables = new HashMap<>();
variables.put("a", 10.0);
variables.put("b", 10);
ctx.setVariables(variables);
// 会自动转换类型, 例如 integer / double
System.out.println(expression.getValue(ctx));
System.out.println(expression.getValue(ctx, BigDecimal.class));
}
/**
* 逻辑表达式
*/
@Test
public void testLogic() {
// 变量统一使用 # 作为前缀
Expression expression = parser.parseExpression("#a >= 15");
StandardEvaluationContext ctx = new StandardEvaluationContext();
Map<String, Object> variables = new HashMap<>();
variables.put("a", 10);
ctx.setVariables(variables);
System.out.println(expression.getValue(ctx));
System.out.println(expression.getValue(ctx, Boolean.class));
}
/**
* 复杂逻辑表达式
*/
@Test
public void testLogicComplex() {
// 变量统一使用 # 作为前缀
Expression expression = parser.parseExpression("(#a >= 15) || (#b < 10)");
StandardEvaluationContext ctx = new StandardEvaluationContext();
Map<String, Object> variables = new HashMap<>();
variables.put("a", 10);
variables.put("b", 8);
ctx.setVariables(variables);
System.out.println(expression.getValue(ctx));
System.out.println(expression.getValue(ctx, Boolean.class));
}