使用场景: 需要执行一些可配置的公式来计算结果
例如:某些公司工资的计算,分各种计算方案,拿到对应字段替换到公式中进行结果计算
依赖
<dependency><groupId>org.apache.commonsgroupId><artifactId>commons-jexl3artifactId><version>3.1version>dependency><dependency><groupId>org.apache.commonsgroupId><artifactId>commons-textartifactId><version>1.3version>dependency>
代码
package com.hzr;import org.apache.commons.jexl3.*;
import org.apache.commons.text.StringSubstitutor;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;import java.math.BigDecimal;
import java.util.*;public class MyTest {public static void main(String[] args) {Map<String,Object> varMap &#61; new HashMap<>();varMap.put("绩效工资",1000);varMap.put("年平均月工作日",21.75);varMap.put("请假天数",20);String ex &#61; "${绩效工资}/${年平均月工作日}*${请假天数}";System.out.println(jexlEval(ex,varMap));try {System.out.println(jsEval(ex,varMap));} catch (ScriptException e) {e.printStackTrace();}Map<String,Object> varMap2 &#61; new HashMap<>();varMap2.put("a",1000);varMap2.put("b",21.75);varMap2.put("c",20);String ex2 &#61; "a/b*c";System.out.println(jexlEval2(ex2,varMap2));}public static Object jsEval(String formula,Map<String,Object> varMap) throws ScriptException {formula &#61; new StringSubstitutor(varMap).replace(formula);ScriptEngine jse &#61; new ScriptEngineManager().getEngineByName("Javascript");Object evaluate &#61; jse.eval(formula);return new BigDecimal(evaluate.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();}public static Object jexlEval(String formula, Map<String,Object> varMap){formula &#61; new StringSubstitutor(varMap).replace(formula);JexlEngine jexlEngine &#61; new JexlBuilder().create();JexlExpression jexlExpression &#61; jexlEngine.createExpression(formula);Object evaluate &#61; jexlExpression.evaluate(null);return new BigDecimal(evaluate.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();}public static Object jexlEval2(String formula, Map<String,Object> varMap){JexlContext jc &#61; new MapContext();varMap.forEach((key,value) ->{jc.set(key,value);});JexlEngine jexlEngine &#61; new JexlBuilder().create();JexlExpression jexlExpression &#61; jexlEngine.createExpression(formula);Object evaluate &#61; jexlExpression.evaluate(jc);return new BigDecimal(evaluate.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();}
}
输出结果
919.54
919.54
919.54