QLExpress
QLExpress 是一个基于 Java 的表达式解析器和规则引擎,它旨在提供一种简单、高效的方式来处理和计算表达式,同时支持规则的定义和执行。QLExpress 适用于需要动态表达式计算和复杂决策逻辑的场景,如金融分析、业务规则管理、数据验证等。
核心特性
- 
    表达式解析:QLExpress 能够解析包含变量、常量、函数调用和操作符的复杂表达式,并计算其结果。 
- 
    规则定义:用户可以定义包含条件和动作的业务规则,QLExpress 根据这些规则执行相应的逻辑。 
- 
    高性能:QLExpress 优化了表达式的编译和执行过程,以提高计算效率。 
- 
    易于集成:作为一个 Java 库,QLExpress 可以轻松集成到任何 Java 应用程序中。 
- 
    灵活性:QLExpress 支持自定义函数和操作符,使得用户可以根据业务需求扩展其功能。 
- 
    错误处理:QLExpress 提供了详细的错误信息和堆栈跟踪,方便开发者调试和定位问题。 
使用场景
- 
    金融分析:在金融领域,QLExpress 可以用来计算投资组合的风险和收益,或者评估贷款申请者的信用等级。 
- 
    业务规则管理:企业可以使用 QLExpress 来定义和管理业务规则,如定价策略、促销活动条件等。 
- 
    数据验证:QLExpress 可以用于验证用户输入数据是否符合特定的业务规则,如年龄限制、密码强度等。 
- 
    报表生成:在生成报表时,QLExpress 可以用来动态计算各种指标,如销售额、成本分析等。 
优势
- 
    易用性:QLExpress 提供了直观的 API,使得定义表达式和规则变得简单快捷。 
- 
    灵活性:支持自定义扩展,可以适应各种复杂的业务逻辑。 
- 
    性能:优化的算法确保了在处理大量数据时仍能保持良好的性能。 
缺点
- 
    文档和社区支持:相较于一些更流行的表达式引擎和规则引擎,QLExpress 的文档和社区支持可能相对较少。 
- 
    功能限制:虽然 QLExpress 提供了基本的表达式解析和规则执行功能,但可能不如一些成熟的规则引擎那样功能全面。 
总的来说,QLExpress 是一个轻量级且功能强大的工具,适合需要在 Java 应用程序中进行表达式计算和业务规则管理的场景。开发者可以利用其灵活性和高性能来构建复杂的业务逻辑,同时保持代码的清晰和可维护性。
应用场景
- 对于不可知的场景,比如风控点编写。
如果全部使用代码编写,调整起来将变得十分麻烦。
- EAV 数据库模式,原始信息的处理
可以将 QLExpress 与 Eav 数据库模式结合起来,使得功能变得强大灵活。
编写此系列博客的目的
- 
    系统学习下 QLExpress,而不是局限于简单的使用。 
- 
    官方 README.md写的有些瑕疵
- 
    便于以后拓展+回顾 
快速开始
jar 的引入
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>QLExpress</artifactId>
    <version>3.2.0</version>
</dependency>
入门案例
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import org.junit.Assert;
import org.junit.Test;
public class HelloWorldTest {
    @Test
    public void helloTest() throws Exception {
        ExpressRunner runner = new ExpressRunner();
        DefaultContext<String, Object> context = new DefaultContext<>();
        context.put("a", 1);
        context.put("b", 2);
        String express = "a+b";
        Object r = runner.execute(express, context, null, true, false);
        Assert.assertEquals(3, r);
    }
}
拓展总结
整体架构

调用方法入参
/**
 * 执行一段文本
 * @param expressString 程序文本
 * @param context 执行上下文,可以扩展为包含ApplicationContext
 * @param errorList 输出的错误信息List
 * @param isCache 是否使用Cache中的指令集,建议为true
 * @param isTrace 是否输出详细的执行指令信息,建议为false
 * @param aLog 输出的log
 * @return
 * @throws Exception
 */
Object execute(String expressString, IExpressContext<String,Object> context,List<String> errorList, boolean isCache, boolean isTrace, Log aLog);
isTrace
/**
 * 是否输出所有的跟踪信息,同时还需要log级别是DEBUG级别
 */
private boolean isTrace = false;
这个主要是是否输出脚本的编译解析过程,一般对于业务系统来说关闭之后会提高性能。
我们将上面的执行中 isTrace 属性设置为 true。日志结果如下:
DEBUG [main] - LoadAttr:a:1
DEBUG [main] - LoadAttr:b:2
DEBUG [main] - +(a:1,b:2)
