diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml
index 51e42bd62..a7c4357e6 100755
--- a/hutool-extra/pom.xml
+++ b/hutool-extra/pom.xml
@@ -31,7 +31,7 @@
3.8.0
5.1.1
4.0.1
- 2.7.2
+ 2.7.4
3.3.0
@@ -430,7 +430,7 @@
com.googlecode.aviator
aviator
- 5.3.1
+ 5.3.2
compile
true
@@ -465,7 +465,7 @@
org.springframework
spring-expression
- 5.3.22
+ 5.3.23
compile
true
@@ -476,6 +476,13 @@
compile
true
+
+ com.alibaba
+ QLExpress
+ 3.3.0
+ compile
+ true
+
org.apache.commons
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java
new file mode 100755
index 000000000..d941685d1
--- /dev/null
+++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java
@@ -0,0 +1,38 @@
+package cn.hutool.extra.expression.engine.qlexpress;
+
+import cn.hutool.extra.expression.ExpressionEngine;
+import cn.hutool.extra.expression.ExpressionException;
+import com.ql.util.express.DefaultContext;
+import com.ql.util.express.ExpressRunner;
+
+import java.util.Map;
+
+/**
+ * QLExpress引擎封装
+ * 见:https://github.com/alibaba/QLExpress
+ *
+ * @author looly
+ * @since 5.8.9
+ */
+public class QLExpressEngine implements ExpressionEngine {
+
+ private final ExpressRunner engine;
+
+ /**
+ * 构造
+ */
+ public QLExpressEngine() {
+ engine = new ExpressRunner();
+ }
+
+ @Override
+ public Object eval(final String expression, final Map context) {
+ final DefaultContext defaultContext = new DefaultContext<>();
+ defaultContext.putAll(context);
+ try {
+ return engine.execute(expression, defaultContext, null, true, false);
+ } catch (final Exception e) {
+ throw new ExpressionException(e);
+ }
+ }
+}
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/package-info.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/package-info.java
new file mode 100755
index 000000000..f3c4cf1e5
--- /dev/null
+++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * QLExpress引擎封装
+ * 见:https://github.com/alibaba/QLExpress
+ *
+ * @author looly
+ */
+package cn.hutool.extra.expression.engine.qlexpress;
diff --git a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine
index df7e3a18c..33aa4f4b6 100644
--- a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine
+++ b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine
@@ -3,4 +3,5 @@ cn.hutool.extra.expression.engine.jexl.JexlEngine
cn.hutool.extra.expression.engine.mvel.MvelEngine
cn.hutool.extra.expression.engine.jfireel.JfireELEngine
cn.hutool.extra.expression.engine.spel.SpELEngine
-cn.hutool.extra.expression.engine.rhino.RhinoEngine
\ No newline at end of file
+cn.hutool.extra.expression.engine.rhino.RhinoEngine
+cn.hutool.extra.expression.engine.qlexpress.QLExpressEngine
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java
index 3499e9dad..fc169d55e 100755
--- a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java
@@ -4,6 +4,7 @@ import cn.hutool.core.map.Dict;
import cn.hutool.extra.expression.engine.jexl.JexlEngine;
import cn.hutool.extra.expression.engine.jfireel.JfireELEngine;
import cn.hutool.extra.expression.engine.mvel.MvelEngine;
+import cn.hutool.extra.expression.engine.qlexpress.QLExpressEngine;
import cn.hutool.extra.expression.engine.rhino.RhinoEngine;
import cn.hutool.extra.expression.engine.spel.SpELEngine;
import org.junit.Assert;
@@ -95,4 +96,16 @@ public class ExpressionUtilTest {
Assert.assertEquals(-143.8, (double)eval, 0);
}
+ @Test
+ public void qlExpressTest(){
+ final ExpressionEngine engine = new QLExpressEngine();
+
+ final Dict dict = Dict.of()
+ .set("a", 100.3)
+ .set("b", 45)
+ .set("c", -199.100);
+ final Object eval = engine.eval("a-(b-c)", dict);
+ Assert.assertEquals(-143.8, (double)eval, 0);
+ }
+
}