首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解锁 QLExpress:高效数据处理的神器

解锁 QLExpress:高效数据处理的神器

作者头像
井九
发布于 2024-10-12 01:49:21
发布于 2024-10-12 01:49:21
83300
代码可运行
举报
文章被收录于专栏:四楼没电梯四楼没电梯
运行总次数:0
代码可运行

简介

QLExpress(Quick Language Express)是一个轻量级、高性能的表达式解析和计算引擎,由阿里云提供。它主要用于动态解析和执行表达式,适用于各种需要动态逻辑判断的场景,如规则引擎、动态配置等。

安装和配置

引入依赖

首先,你需要在你的项目中引入QLExpress的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>QLExpress</artifactId>
    <version>3.2.0</version>
</dependency>

如果你使用的是Gradle,可以在build.gradle文件中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implementation 'com.alibaba:QLExpress:3.2.0'
基本配置

引入依赖后,你可以在你的Java代码中创建一个ExpressRunner实例,这是QLExpress的核心类,负责解析和执行表达式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;

public class QLExpressExample {
    public static void main(String[] args) {
        ExpressRunner runner = new ExpressRunner();
    }
}

基本用法

解析和执行简单表达式

你可以使用ExpressRunnerparseExpression方法来解析表达式,然后使用execute方法来执行表达式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.Operator;

public class QLExpressExample {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        String express = "1 + 2 * 3";
        Object result = runner.execute(express, null, null, null, null);
        System.out.println("Result: " + result); // 输出: Result: 7
    }
}
使用变量

你可以在表达式中使用变量,并通过context参数传递变量的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import com.ql.util.express.context.DefaultExpressContext;

public class QLExpressExample {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        String express = "a + b * c";
        IExpressContext<String, Object> context = new DefaultExpressContext<>();
        context.put("a", 1);
        context.put("b", 2);
        context.put("c", 3);
        Object result = runner.execute(express, context, null, true, false);
        System.out.println("Result: " + result); // 输出: Result: 7
    }
}
自定义操作符

QLExpress允许你自定义操作符,以满足特定的业务需求。你可以通过继承Operator类来实现自定义操作符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.Operator;

public class QLExpressExample {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        runner.addOperator("add", new AddOperator());
        String express = "1 add 2";
        Object result = runner.execute(express, null, null, null, null);
        System.out.println("Result: " + result); // 输出: Result: 3
    }
}

class AddOperator extends Operator {
    @Override
    public Object executeInner(Object[] list) throws Exception {
        int a = (Integer) list[0];
        int b = (Integer) list[1];
        return a + b;
    }
}

高级用法

函数调用

QLExpress支持在表达式中调用Java方法。你可以通过addFunction方法来注册自定义函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;

public class QLExpressExample {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        runner.addFunction("add", new AddFunction());
        String express = "add(1, 2)";
        Object result = runner.execute(express, null, null, null, null);
        System.out.println("Result: " + result); // 输出: Result: 3
    }
}

class AddFunction {
    public int add(int a, int b) {
        return a + b;
    }
}
脚本执行

QLExpress还支持执行复杂的脚本,你可以通过executeScript方法来执行脚本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;

public class QLExpressExample {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        String script = "int a = 1;\n" +
                        "int b = 2;\n" +
                        "int c = a + b;\n" +
                        "return c;";
        Object result = runner.executeScript(script, null, null, null, null);
        System.out.println("Result: " + result); // 输出: Result: 3
    }
}

生动有趣的例子

购物车折扣计算

假设你正在开发一个电商应用,需要根据用户的购物车内容计算折扣。你可以使用QLExpress来动态计算折扣。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import com.ql.util.express.context.DefaultExpressContext;

public class ShoppingCartDiscount {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        String express = "if (totalAmount >= 1000) { return totalAmount * 0.9; } else { return totalAmount; }";
        IExpressContext<String, Object> context = new DefaultExpressContext<>();
        context.put("totalAmount", 1200);
        Object result = runner.execute(express, context, null, true, false);
        System.out.println("Discounted Amount: " + result); // 输出: Discounted Amount: 1080.0
    }
}
动态评分系统

假设你正在开发一个评分系统,需要根据用户的评分动态计算综合评分。你可以使用QLExpress来实现这个功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import com.ql.util.express.context.DefaultExpressContext;

public class DynamicRatingSystem {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        String express = "(qualityScore * 0.6 + serviceScore * 0.3 + priceScore * 0.1) / 1.0";
        IExpressContext<String, Object> context = new DefaultExpressContext<>();
        context.put("qualityScore", 90);
        context.put("serviceScore", 85);
        context.put("priceScore", 70);
        Object result = runner.execute(express, context, null, true, false);
        System.out.println("Composite Score: " + result); // 输出: Composite Score: 86.5
    }
}
动态规则引擎

假设你正在开发一个规则引擎,需要根据不同的规则动态执行不同的逻辑。你可以使用QLExpress来实现这个功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import com.ql.util.express.context.DefaultExpressContext;

public class DynamicRuleEngine {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        String express = "if (age >= 18) { return 'Adult'; } else { return 'Minor'; }";
        IExpressContext<String, Object> context = new DefaultExpressContext<>();
        context.put("age", 20);
        Object result = runner.execute(express, context, null, true, false);
        System.out.println("Classification: " + result); // 输出: Classification: Adult
    }
}

总结

通过这些生动有趣的例子,我们可以看到QLExpress在实际应用中的强大功能和灵活性。无论是购物车折扣计算、动态评分系统还是动态规则引擎,QLExpress都能帮助你轻松实现复杂的逻辑判断和计算。希望这些例子能激发你的灵感,让你在项目中更好地利用QLExpress。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
这 5 种规则引擎,真香!
当规则变成:"非VIP用户满200减30,VIP用户满150减40,且周二全场额外95折"时,代码将陷入维护地狱!
苏三说技术
2025/06/23
1530
这 5 种规则引擎,真香!
liteflow学习二
在LiteFlowChainELBuilder可以看到EL表达式的逻辑是基于阿里开源的QLExpress实现的, 在初始化QLExpress的Runner中,作者扩展了很多操作Operator。在setEL(String elStr)这个方法中,我们可以会将FlowBus中的chainMap和NodeMap放入到Context中,也即DefaultContext,同时放入当前的chainId。接着会解析el表达式,解析成最外部一个condition, 内部可以嵌套很多层。
路行的亚洲
2023/10/08
7860
liteflow学习二
Java各种规则引擎
(2)新建配置文件/src/resources/META-INF/kmodule.xml
matinal
2020/11/27
5.3K1
Java各种规则引擎
利用 Aviator 实现规则配置
我们调研了业界主流的一些规则引擎以及表达式引擎,如 Drools、EasyRule、JEXL、Aviator、qlExpress 等。从复杂度、与我们目前需求的契合程度、扩展性、性能、社区活跃度、文档、资料的完善程度以及使用者的学习成本等多方面考虑,决定采用 Aviator 来作为 filter_express 解析引擎 。 Aviator创建之初就是为了高性能、轻量级,并且支持自定函数以及各种定制选项,拥有各种内置函数且扩展较好,足够简单,用户的学习成本足够低,并且可以完美解决这个的问题。
shengjk1
2021/12/08
4.3K0
秒懂java规则表达式框架Aviator2.3.0
在我们的业务场景中有一个需求,我们有一个配置功能,该功能需要配置两个变量之间比较大小。使用tab比较难表达,所以就提出了,可以让用户写比较简单的函数进行配置。或者选tab进行选择(前段直接将对应的tab字符串拼接来给后端执行)。
袁新栋-jeff.yuan
2020/08/26
6.4K0
秒懂java规则表达式框架Aviator2.3.0
ognl与struts2漏洞的学习
Struts2这个框架每年都会出现那么几个漏洞,不得不引起斗哥学习的兴趣。本期将从Struts2的一个罪魁祸首ONGL表达式开始介绍到S2-001漏洞的分析。Struts2系列的漏洞涉及Java Web等相关内容,后续会持续更新漏洞分析以及相关知识背景介绍等。
漏斗社区
2018/09/29
9690
ognl与struts2漏洞的学习
JAVA安全之Velocity模板注入刨析
关于Velocity模板注入注入之前一直缺乏一个系统性的学习和整理,搜索网上大多数类似的内容都是一些关于漏洞利用的复现,而且大多都仅限于Velocity.evaluate的执行,对于载荷的构造以及执行过程并没有详细的流程分析,于是乎只能自己动手来填坑了~
Al1ex
2024/09/26
4200
JAVA安全之Velocity模板注入刨析
风控规则引擎(二):多个条件自由组合的实现,如何将 Java 字符串转换成 Java 对象
在上一篇中介绍了一个单独的动态表达式是如何执行的,这里讲一下多个表达式不同组合情况下的实现。这里主要介绍下面 2 种情况的设计,其他可自行扩展
双鬼带单
2023/12/18
6690
风控规则引擎(二):多个条件自由组合的实现,如何将 Java 字符串转换成 Java 对象
Google Aviator——轻量级 Java 表达式引擎实战
Drools(JBoss Rules )是一个开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
科技新语
2023/01/09
6.5K0
Google Aviator——轻量级 Java 表达式引擎实战
利用java8 的 CompletableFuture 优化 Flink 程序
目前 Flink 利用 avatorscript 脚本语言,来做到规则的自动化更新。avatorscript将表达式直接翻译成对应的 java 字节码执行,所以在大数据量的情况下,自然而然这里就成为了瓶颈
每周聚焦
2024/10/15
1620
利用java8 的 CompletableFuture 优化 Flink 程序
easy-rules小试牛刀
easy-rules-core-3.1.0-sources.jar!/org/jeasy/rules/api/Rule.java
code4it
2018/09/17
2.1K0
[ SSH框架 ] Struts2框架学习之二
一、Struts2访问Servlet的API   前面已经对 Struts2的流程已经执行完成了,但是如果表单中有参数如何进行接收又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习 S
Kevin_Zhang
2018/09/20
7770
[ SSH框架 ] Struts2框架学习之二
Struts2第二天:Struts2的数据的封装、结果页面配置
在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的。在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到Session中,有的时候需要向页面输出一些内容,用到response对象。涉及到Servlet的API的访问。
AlbertYang
2020/09/08
5640
ognl表达式-OGNL表达式基本语法与用法详解
  这篇文章主要介绍了OGNL表达式基本语法与用法详解,具有一定参考价值。需要的朋友可以了解下。
宜轩
2022/12/26
1.8K0
Ognl 使用实例手册
上一篇博文介绍了ongl的基础语法,接下来进入实际的使用篇,我们将结合一些实际的case,来演示ognl究竟可以支撑到什么地步
一灰灰blog
2019/12/16
3.7K0
OGNL (Object-Graph Navigation Language) 表达式 极简教程
OGNL stands for Object-Graph Navigation Language; it is an expression language for getting and setting properties of Java objects, plus other extras such as list projection and selection and lambda expressions. You use the same expression for both getting and setting the value of a property.
一个会写诗的程序员
2022/01/07
1.6K0
干掉 Activiti 、Flowable!阿里开源流程引擎框架真香!
compileflow Process 引擎是淘宝工作流 TBBPM 引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成 java 代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。
macrozheng
2021/07/27
10.7K0
干掉 Activiti 、Flowable!阿里开源流程引擎框架真香!
Java解析XML字符串「建议收藏」
在网上找了很多Java语言解析XML字符串的资料,很多内容写得很繁复,没有普适性,遂自己动手写了一个用Java解析XML的工具类。话不多说,直接看下面代码:
全栈程序员站长
2022/09/05
7520
这款轻量级 Java 表达式引擎,真不错!
前面文章介绍过几款规则引擎,今天介绍一款轻量级规则引擎:aviator,往期介绍如下:
码猿技术专栏
2023/09/07
1.8K0
这款轻量级 Java 表达式引擎,真不错!
Java+Spring 实现任务调度Quartz框架(纯Java实现+Spring实现) 读写Excel
开发工具: Myelicps2014 这里选用Quartz 的1.8.6版本,此版本在项目中应用较多,也较为稳定
Java_慈祥
2024/08/06
2100
Java+Spring 实现任务调度Quartz框架(纯Java实现+Spring实现) 读写Excel
相关推荐
这 5 种规则引擎,真香!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验