含stream、map、collect的Jexl表达式解析异常求助及示例需求
Jexl3表达式解析异常修复及Stream API使用示例
问题分析
你在使用基于Jexl3的表达式求值方法时,传入的Stream+Lambda表达式触发了org.apache.commons.jexl3.JexlException$Parsing异常,核心原因是Jexl3的Lambda语法和Java原生语法存在差异,同时表达式内存在参数引用错误:
- Lambda参数引用错误:表达式中Lambda参数定义为
myDriver,但内部却使用了未定义的vtd,导致解析混乱 - Jexl3 Lambda语法要求:Jexl3要求Lambda的逻辑体必须用大括号
{}包裹,即使是单语句逻辑
修复后的表达式
record.getDriversMap().values().stream().filter(myDriver -> { 'Fav_Driver'.equals(myDriver.getAttributeName()) }).collect(java.util.stream.Collectors.toList())
注意:如果JexlEngine未自动导入Collectors类,必须使用全限定类名java.util.stream.Collectors;若已通过配置导入,可直接使用Collectors。
Stream API的Jexl表达式示例
1. 过滤+收集列表
// 筛选attributeName为"Fav_Driver"的司机并收集为列表 record.getDriversMap().values().stream().filter(d -> { d.getAttributeName() == 'Fav_Driver' }).collect(java.util.stream.Collectors.toList())
2. 映射+去重收集
// 提取所有司机的attributeName并去重为Set record.getDriversMap().values().stream().map(d -> { d.getAttributeName() }).collect(java.util.stream.Collectors.toSet())
3. 过滤+映射+数值求和
假设MyDriver包含age字段,筛选成年司机并计算年龄总和:
record.getDriversMap().values().stream().filter(d -> { d.getAge() >= 18 }).mapToInt(d -> { d.getAge() }).sum()
4. 排序+收集
// 按attributeName排序后收集为列表 record.getDriversMap().values().stream().sorted((a,b) -> { a.getAttributeName().compareTo(b.getAttributeName()) }).collect(java.util.stream.Collectors.toList())
内容的提问来源于stack exchange,提问作者Gowtham Kesa
相关产品推荐
相关产品推荐

