Java 解析表達式

最近項目需要用到配置表達式,然後後臺解析表達式並運行得到結果,類似這種"true||true"表達式,java裏自帶的不支持這種,只能用java裏的ScriptEngine的js引擎來執行,但是效率太慢了,跑個400萬數據要幾十天,太慢了,後來優化了一下也要4天,雖然快了10倍左右,但還是達不到項目要求。

String expression="true||true";

ScriptEngine  s = new ScriptEngineManager().getEngineByName("js");

isPassFlag = (boolean) s.eval(expression);//運行表達式得到值

看了看代碼也實在看不出哪裏還可以優化了,想想只能換個能運行表達式的類庫或者jar包,果然找到了其他的一些,如

IKExpression和Apache 的Jakarta Commons Jexl,前者因爲在maven工程裏找不到jar包,我先試了下後面的jexl,感覺速度和js引擎來執行
表達式速度沒快多少。
JexlContext jexlContext = JexlHelper.createContext(); 
Expression expression1 = ExpressionFactory.createExpression(expression);   
isPassFlag = (boolean) expression1.evaluate(jexlContext); 


只能忍着用導入本地jar包的方式把IKExpression導入到工程,試了下速度,400萬大概8小時,比js的快10多倍。
這下可以了,哈哈
isPassFlag = (boolean) ExpressionEvaluator.evaluate(expression);

pom.xml中加入:
        <dependency>
            <groupId>org.wltea.expression</groupId>
            <artifactId>IKExpression</artifactId>
            <version>2.1.2s</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/IKExpression2.1.2.jar</systemPath>
        </dependency>

ikexpression下載:https://code.google.com/archive/p/ik-expression/downloads
官網:https://code.google.com/archive/p/ik-expression/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章