1. QLExpress变量与数据类型:表达式世界的基石
在规则引擎和动态脚本的世界里,变量和数据类型就像建筑工地的砖块与钢筋。QLExpress作为阿里巴巴开源的轻量级规则引擎,其变量系统设计既保留了Java的严谨性,又融入了脚本语言的灵活性。我曾在电商风控系统中深度使用QLExpress处理每天数千万次的规则计算,深刻体会到合理运用变量特性对系统性能的影响。
1.1 动态类型与静态类型的双模式
QLExpress最令人称道的特性之一是支持动态和静态两种变量声明方式:
java复制// 动态类型 - 编译时不检查类型,运行时动态推断
userName = "张三" // 自动识别为String类型
orderCount = 5 // 自动识别为Integer类型
// 静态类型 - 编译时进行类型检查
String department = "财务部"
int annualBonus = 30000
实际项目中的经验:在金融风控场景中,对于核心业务参数(如交易金额、用户ID)建议使用静态类型,可以提前发现类型错误;而对于业务规则中的临时变量,使用动态类型能提高脚本编写效率。
1.2 八大基础数据类型详解
QLExpress完整支持Java的基础数据类型,并做了智能扩展:
| 数据类型 | 示例值 | 存储大小 | 特别说明 |
|---|---|---|---|
| Boolean | true | 1字节 | 支持&&、||短路运算 |
| Integer | 42 | 4字节 | 自动处理int/long转换 |
| Double | 3.14 | 8字节 | 高精度计算时转BigDecimal |
| String | "北京" | 变长 | 支持${}动态插值 |
| List | [1,2] | 变长 | 底层使用ArrayList |
| Map | 变长 | 底层使用LinkedHashMap | |
| BigDecimal | 3.1415926 | 可变 | 金融计算专用 |
| Null | null | - | 所有类型的默认值 |
踩坑提醒:在比较浮点数时,务必使用BigDecimal类型。我们曾遇到0.1+0.2≠0.3的问题,最终通过强制类型转换解决:
java复制// 错误示范
price = 0.1 + 0.2 // 实际结果为0.30000000000000004
// 正确做法
price = new BigDecimal("0.1").add(new BigDecimal("0.2")) // 精确等于0.3
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 变量作用域与生命周期管理
2.1 上下文变量的高效传递
QLExpress通过Context对象管理变量作用域,这是性能优化的关键点。在日均亿级调用的推荐系统中,我们总结出最佳实践
