You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含stream、map、collect的Jexl表达式解析异常求助及示例需求

Jexl3表达式解析异常修复及Stream API使用示例

问题分析

你在使用基于Jexl3的表达式求值方法时,传入的Stream+Lambda表达式触发了org.apache.commons.jexl3.JexlException$Parsing异常,核心原因是Jexl3的Lambda语法和Java原生语法存在差异,同时表达式内存在参数引用错误:

  1. Lambda参数引用错误:表达式中Lambda参数定义为myDriver,但内部却使用了未定义的vtd,导致解析混乱
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:10:24