场景
需要使用动态拼接数字和字符串的混合运算,多个计算表达式之间的与或运算。(例如:a>10 && b<100 …)
自己手动解析拼接好的计算表达式有些麻烦,直接使用JEXL来解析计算表达式,JEXL遵循apache的开源规则,这样用起来就非常的方便。
使用方法
1、引如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>
2、编辑工具类
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());
}
}
3、测试使用
测试代码
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来解析,开发效率会提高很多。