MVEL运算符重载

时间:2014-03-12 07:07:39

标签: java overloading mvel

MVEL使得向解析器上下文提供自定义函数变得非常容易,但是不清楚是否存在“官方”官方信息。重载运算符评估方式的方法。我有两个具体的用例:

  • 对数组执行算术运算应将操作映射到数组的每个元素,例如:

    [1, 2, 3] + 1 == [2, 3, 4]

  • 任何带有空操作数的操作都应该计算为null(如Excel中的#N/A),这样:

    1 + null == null

如果没有'官方'解决这个问题,是否有一种明显的方法可以阻止MVEL实现这一目标?

1 个答案:

答案 0 :(得分:0)

第二期

1+ null == null

1* null

如果您在Mvel API类中实际调试它,则它们会针对此特定情况显式返回false1null

如果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 + bcheckNullValue(a) + checkNullValue(b)