public class ArithmeticUtil { private static GroovyShell groovyShell = new GroovyShell(); private static Map<String, Script> scriptCache = new ConcurrentHashMap<>(); /** * 四则运算 */ public static BigDecimal getFormulaResult(Map<String, BigDecimal> map, String formula){ if (StringUtils.isBlank(formula) || map == null) { return BigDecimal.ONE; } log.info("数据计算公式:{},参数值:{}", formula , JSON.toJSON(map)); Object resultData = runGroovyShell(map, formula); BigDecimal result = new BigDecimal(resultData.toString()); log.info("计算结果:" + result); return result; } public static Object runGroovyShell(Map<String, BigDecimal> values, String formula){ if (values == null || StringUtils.isBlank(formula)) { return BigDecimal.ONE; } if (formula.length() == 1) { return values.getOrDefault(formula,BigDecimal.ONE); } Object scriptObject = null; try { Binding binding = new Binding(); for (String key : values.keySet()) { binding.setVariable(key, values.get(key)); } Script shell = scriptCache.get(formula); if (shell == null) { shell = groovyShell.parse(formula,formula); scriptCache.put(formula, shell); } scriptObject = InvokerHelper.createScript(shell.getClass(), binding).run(); } catch (Throwable t) { log.error("groovy script eval error. script: " + formula, t); } return scriptObject; } public static void main(String[] args) throws Exception { int end=10,start=1; for (int i=0;i<10;i++) { Thread t = new Thread(() -> { String formula = "A"; Map<String, BigDecimal> map = new HashMap(); for (int j=0;j<3;j++){ map.put("A", new BigDecimal((int)(Math.random() * (end-start+1) + start))); map.put("B", new BigDecimal((int)(Math.random() * (end-start+1) + start))); map.put("C", new BigDecimal((int)(Math.random() * (end-start+1) + start))); map.put("D", new BigDecimal((int)(Math.random() * (end-start+1) + start))); map.put("E", new BigDecimal((int)(Math.random() * (end-start+1) + start))); BigDecimal result = getFormulaResult(map, formula); System.out.println("线程"+Thread.currentThread().getName()+ "--" + JSON.toJSONString(map) + "--"+ result); } }); t.start(); } } }
四则运算
最新推荐文章于 2022-05-09 14:55:36 发布