Java 表达式计算通常涉及解析和执行数学或逻辑表达式。在 Java 中,有几种方法可以实现表达式的计算,包括使用内置的 ScriptEngine(如 JavaScript 引擎)、第三方库(如 Apache Commons Math、Exp4j 、Jep等),或者自己编写解析器和执行器。
以下是第三方库jep的使用示例(Jep文档)
引入依赖
<dependency>
<groupId>com.exp-blog</groupId>
<artifactId>jep</artifactId>
<version>3.4.0</version>
</dependency>
测试代码
public static void main(String[] args) {
String expression = "[water] + <code> + {salary} + 1";
Map<String,Double> valMap = new HashMap<>();
valMap.put("water",2.0);
valMap.put("code",3.0);
valMap.put("{a}",1.0);
List<String> resultList = new ArrayList<>();
String regex = "(\\[[\\w\\-]+\\])|(<[\\w\\-]+>)|(\\{[\\w\\-]+\\})";
Matcher match = Pattern.compile(regex).matcher(expression);
String matchSubCode;
while (match.find()) {
matchSubCode = match.group().replace("<", "").replace(">", "")
.replace("[", "").replace("]", "");
if (!resultList.contains(matchSubCode)) {
resultList.add(matchSubCode);
}
}
expression = expression.replace("<", "").replace(">", "")
.replace("[", "").replace("]", "");
for (String code : resultList){
expression = expression.replace(code,valMap.getOrDefault(code,0.0).toString());
}
Double result;
try {
Jep jep = new Jep();
jep.parse(expression);
result = jep.evaluateD();
if(Double.isNaN(result)) result = 0.0;
}catch (Exception e){
result = null;
log.error("表达式{}计算异常",expression);
}
System.err.println(result);
return;
}