MVEL使向解析器上下文提供自定义函数非常容易,但是尚不清楚是否存在“官方”方式来重载运算符的求值方式。我想到了两个特定的用例:
在数组上执行算术运算应将操作映射到数组的每个元素上,从而:[1, 2, 3] + 1 == [2, 3, 4]
操作数为空的任何操作都应评估为空(如Excel中的#N/A
),使得:1 + null == null
如果没有对此的“官方”解决方案,那么有没有一种明显的方法可以侵入MVEL来实现这一目标?
最佳答案
第二期
1+ null == null
或
1* null
如果您实际上在Mvel API类中对此进行调试,则对于这种特殊情况,它们将显式返回
false
或1null
。如果Mvel可以解决此问题,那将是很好。但是我也遇到了同样的问题,所以我们做的是,在执行表达式之前创建了一些智能,修改了表达式并添加了“ IF”条件,以检查是否为空并且将运算符设置为“ /”或“ *” ”,则返回null。
您也可以使用
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)