js方式
demo code
public static void main(String args[]) throws ScriptException { String str = "43*(2 + 1.4)+2*32/(3-2.1)"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Object result = engine.eval(str); System.out.println(result); }
exp4j方式
maven依赖
<dependency> <groupId>net.objecthunter</groupId> <artifactId>exp4j</artifactId> <version>0.4.8</version> </dependency>
demo code
public static void main(String args[]) { double evaluate = new ExpressionBuilder("a*b/1").variables("a", "b").build() .setVariable("a", 4).setVariable("b", 5) .evaluate(); System.out.println(evaluate); }
Groovy方式
maven依赖
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.4.7</version> </dependency>
demo code public static void main(String args[]) throws ScriptException { Binding binding = new Binding(); binding.setVariable("a",2.5); binding.setVariable("b",30); binding.setVariable("language", "Groovy"); GroovyShell shell = new GroovyShell(binding); Object evaluate = shell.evaluate("a*b/1"); System.out.println(evaluate); }
JEP方式
maven依赖
<dependency> <groupId>org.scijava</groupId> <artifactId>jep</artifactId> <version>2.4.2</version> </dependency>
demo code public static void main(String args[]) { String exp = "((a+b)*(c+b))/(c+a)/b"; JEP jep = new JEP(); jep.addVariable("a", 16); jep.addVariable("b", 5); jep.addVariable("c", 66); jep.parseExpression(exp); Object result = jep.getValueAsObject(); System.out.println("计算结果: " + result); }
JEXL方式
maven依赖
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-jexl</artifactId> <version>2.1.1</version> </dependency>
demo code public static void main(String args[]) { JexlContext jc = new MapContext(); jc.set("a",4); jc.set("b",5); Expression e = new JexlEngine().createExpression("a*b/1"); Object result = e.evaluate(jc); System.out.println(result); }
以上方式测试耗时截图(平均耗时)
结论:一般接口请求适用,如果专门用于计算的接口相对效率比较低。
接下来自己实现了一个支持基础运算(括号)的运算器,耗时
public static void main(String[] args) { long startTime = System.currentTimeMillis(); for (int i = 0; i < 40000; i++) { handle("0.1*"+i+"-273.1"); } Double time = Double.valueOf(System.currentTimeMillis() - startTime); System.out.println("40000次计算耗时:"+time +"ms -----每毫秒计算"+(1/(time/40000))+"次数"); }