MVEL 使得向解析器上下文提供自定义函数变得非常容易,但目前尚不清楚是否有一种“官方”方式来重载如何评估运算符。我有两个特定的用例:
对数组执行算术运算应将操作映射到数组的每个元素上,例如:
[1, 2, 3] + 1 == [2, 3, 4]
任何具有空操作数的操作都应计算为空(如
#N/A
在 Excel 中),例如:1 + null == null
如果对此没有“官方”解决方案,是否有一种明显的方法可以侵入 MVEL 来实现这一点?
MVEL 使得向解析器上下文提供自定义函数变得非常容易,但目前尚不清楚是否有一种“官方”方式来重载如何评估运算符。我有两个特定的用例:
对数组执行算术运算应将操作映射到数组的每个元素上,例如:
[1, 2, 3] + 1 == [2, 3, 4]
任何具有空操作数的操作都应计算为空(如#N/A
在 Excel 中),例如:
1 + null == null
如果对此没有“官方”解决方案,是否有一种明显的方法可以侵入 MVEL 来实现这一点?
第 2 期
1+ null == null
或者1* null
如果您实际上在 Mvel API 类中调试它,它们会显式返回false
或1null
针对这种特殊情况。
如果 Mvel 能解决这个问题,那就太好了。但是我也遇到了同样的问题,所以我们做了什么,我们在执行表达式之前创建了一些智能,我们修改了表达式并包含了“IF”条件来检查字段是否为空并且运算符为“/”或“* ",返回空值。
您也可以使用VariableResolverFactory
,并传递您的功能,如下所示
private static VariableResolverFactory getMvelFactory(Map contextMap) {
VariableResolverFactory functionFactory = new MapVariableResolverFactory(contextMap);
MVEL.eval("checkNullValue = def (x) { x == null ? 0 : x };", functionFactory);
return functionFactory;
}
所以通过这个你可以修改你的可执行表达式如下并返回任何值。基本上需要在 MVEL 之上编写一个包装器。
a + b
至checkNullValue(a) + checkNullValue(b)