您的位置:首页 > 编程语言 > Java开发

Java 解析表达式

2016-07-19 15:01 1301 查看
最近项目需要用到配置表达式,然后后台解析表达式并运行得到结果,类似这种"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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: