前言
这几天公司做的业务用到了动态拼接数字和字符串的混合运算,多个计算表达式之间的与或运算。
自己手动解析拼接好的计算表达式有些麻烦,我就网上找资料,看有没有自动解析计算表达式的方法,
自己找到了很多方法,最后使用JEXL来解析计算表达式,JEXL遵循apache的开源规则,这样用起来
就非常的方便, 现在就记录下自己是如何使用的。
开始码代码
引入maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-jexl -->
<!--jexl解析表达式-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.1</version>
</dependency>
直接上自己写的测试代码
package com.cgp.expression.util;
import org.apache.commons.jexl3.JexlContext;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.commons.jexl3.MapContext;
import org.apache.commons.jexl3.internal.Engine;
import java.util.HashMap;
import java.util.Map;
public class ExpressionUtil {
/**
* 根据表达式和参数参数集合进行表达式的计算
* @param eval
* @param map
* @return
*/
private static Object executeExpression(String eval, Map<String, Object> map) {
JexlExpression expression = new Engine().createExpression(eval);
JexlContext context = new MapContext(map);
Object result = expression.evaluate(context);
return result;
}
/**
* 表达式解析并返回Boolean类型的计算结果
* @param eval
* @param map
* @return
*/
public static Boolean executeExpressionResult(String eval, Map<String, Object> map) {
Object object = executeExpression(eval, map);
return Boolean.valueOf(object.toString());
}
public static void main(String[] args) {
String eval = "a>10 && b<100";
Map<String, Object> map = new HashMap<>();
map.put("a", 6);
map.put("b", 6);
Boolean result = executeExpressionResult(eval, map);
System.out.println(result);
}
}
运行结果
从上面的运行结果可以看出,JEXL支持数值之间的运算,也支持位与运算,功能可以说是比较强大了
可以解析true和false关键字
public static void main(String[] args) {
String eval = "true && b<100";
Map<String, Object> map = new HashMap<>();
map.put("b", 6);
Boolean result = executeExpressionResult(eval, map);
System.out.println(result);
}
运行结果
可以看出,JEXL可以解析true或者false这种位与运算的关键字,这样对于某些特定场合的解析就会非常方便了。
总结
JEXL支持解析数值计算,位与运算,以及true和false这种关键字的解析,功能非常强大,以后业务里面用到解析表达式可以用JEXL来解析,开发效率会提高很多。