天天看點

Java智能計算

昨天有位剛入行的java工程師問我有沒有什麼方法直接執行通過遠端調用擷取到的公式,我當時腦子裡面第一冒出來是js的eval函數,我就告訴他js的eval()可以實作他的需求,當時由于他沒怎麼接觸js,聽得一臉懵逼,我這才反應過來他是寫java的。由于我的工作中很少遇到這種應用場景,當時我也沒想起java裡面怎麼實作,當時的想法是把那個公式當作一段java代碼,然後實時編譯、執行;轉念又一想,java這麼古老強大的語言,這種應用場景肯定早就有很好的原生解決方案了。搜尋了一下,找到2種實作方案。1、JDK1.6裡面的ScriptEngine;2、JEXL。

下面分别說明一下2種方案的具體使用。

ScriptEngine

JDK1.6引入ScriptEngine,用于執行JavaScript這樣的腳本語言,是以js的eval函數當然也可以通過它來執行。

public static void test1(){
    String ddd = "10+20";
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    Object result = null;
    try {
      result = engine.eval(ddd);
    } catch (ScriptException e) {
      e.printStackTrace();
    }
    System.out.println("結果類型:" + result.getClass().getName() + ",計算結果:" + result);
  }
           

JEXL

Java Expression Language (JEXL) 是一個表達式語言引擎,可以用來在應用或者架構中使用。JEXL 受Velocity 和 JSP 标簽庫 1.1 (JSTL) 的影響而産生的。需要注意的是, JEXL 并不是 JSTL 中的表達式語言的實作。

使用JEXL需要引入對應的jar包。

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-jexl3</artifactId>
  <version>3.1</version>
</dependency>
           

具體使用如下:

public static void test2(){
    JexlEngine jexl = new JexlBuilder().create();

    String jexlExp = "10+20";
    JexlExpression e = jexl.createExpression( jexlExp );

    // Create a context and add data
    JexlContext jc = new MapContext();
    //jc.set("foo", new Foo() );

    Object result= e.evaluate(jc);
    System.out.println("結果類型:" + result.getClass().getName() + ",計算結果:" + result);
  }
           

原文:http://www.itclj.com/blog/5a011c0281c06e4103ef5126